1 // Copyright 2019 The libgav1 Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "src/gav1/decoder.h"
16
17 #include <memory>
18 #include <new>
19
20 #include "src/decoder_impl.h"
21
22 extern "C" {
23
Libgav1DecoderCreate(const Libgav1DecoderSettings * settings,Libgav1Decoder ** decoder_out)24 Libgav1StatusCode Libgav1DecoderCreate(const Libgav1DecoderSettings* settings,
25 Libgav1Decoder** decoder_out) {
26 std::unique_ptr<libgav1::Decoder> cxx_decoder(new (std::nothrow)
27 libgav1::Decoder());
28 if (cxx_decoder == nullptr) return kLibgav1StatusOutOfMemory;
29
30 libgav1::DecoderSettings cxx_settings;
31 cxx_settings.threads = settings->threads;
32 cxx_settings.frame_parallel = settings->frame_parallel != 0;
33 cxx_settings.blocking_dequeue = settings->blocking_dequeue != 0;
34 cxx_settings.on_frame_buffer_size_changed =
35 settings->on_frame_buffer_size_changed;
36 cxx_settings.get_frame_buffer = settings->get_frame_buffer;
37 cxx_settings.release_frame_buffer = settings->release_frame_buffer;
38 cxx_settings.release_input_buffer = settings->release_input_buffer;
39 cxx_settings.callback_private_data = settings->callback_private_data;
40 cxx_settings.output_all_layers = settings->output_all_layers != 0;
41 cxx_settings.operating_point = settings->operating_point;
42 cxx_settings.post_filter_mask = settings->post_filter_mask;
43
44 const Libgav1StatusCode status = cxx_decoder->Init(&cxx_settings);
45 if (status == kLibgav1StatusOk) {
46 *decoder_out = reinterpret_cast<Libgav1Decoder*>(cxx_decoder.release());
47 }
48 return status;
49 }
50
Libgav1DecoderDestroy(Libgav1Decoder * decoder)51 void Libgav1DecoderDestroy(Libgav1Decoder* decoder) {
52 auto* cxx_decoder = reinterpret_cast<libgav1::Decoder*>(decoder);
53 delete cxx_decoder;
54 }
55
Libgav1DecoderEnqueueFrame(Libgav1Decoder * decoder,const uint8_t * data,size_t size,int64_t user_private_data,void * buffer_private_data)56 Libgav1StatusCode Libgav1DecoderEnqueueFrame(Libgav1Decoder* decoder,
57 const uint8_t* data, size_t size,
58 int64_t user_private_data,
59 void* buffer_private_data) {
60 auto* cxx_decoder = reinterpret_cast<libgav1::Decoder*>(decoder);
61 return cxx_decoder->EnqueueFrame(data, size, user_private_data,
62 buffer_private_data);
63 }
64
Libgav1DecoderDequeueFrame(Libgav1Decoder * decoder,const Libgav1DecoderBuffer ** out_ptr)65 Libgav1StatusCode Libgav1DecoderDequeueFrame(
66 Libgav1Decoder* decoder, const Libgav1DecoderBuffer** out_ptr) {
67 auto* cxx_decoder = reinterpret_cast<libgav1::Decoder*>(decoder);
68 return cxx_decoder->DequeueFrame(out_ptr);
69 }
70
Libgav1DecoderSignalEOS(Libgav1Decoder * decoder)71 Libgav1StatusCode Libgav1DecoderSignalEOS(Libgav1Decoder* decoder) {
72 auto* cxx_decoder = reinterpret_cast<libgav1::Decoder*>(decoder);
73 return cxx_decoder->SignalEOS();
74 }
75
Libgav1DecoderGetMaxBitdepth()76 int Libgav1DecoderGetMaxBitdepth() {
77 return libgav1::Decoder::GetMaxBitdepth();
78 }
79
80 } // extern "C"
81
82 namespace libgav1 {
83
84 Decoder::Decoder() = default;
85
86 Decoder::~Decoder() = default;
87
Init(const DecoderSettings * const settings)88 StatusCode Decoder::Init(const DecoderSettings* const settings) {
89 if (impl_ != nullptr) return kStatusAlready;
90 if (settings != nullptr) settings_ = *settings;
91 return DecoderImpl::Create(&settings_, &impl_);
92 }
93
EnqueueFrame(const uint8_t * data,const size_t size,int64_t user_private_data,void * buffer_private_data)94 StatusCode Decoder::EnqueueFrame(const uint8_t* data, const size_t size,
95 int64_t user_private_data,
96 void* buffer_private_data) {
97 if (impl_ == nullptr) return kStatusNotInitialized;
98 return impl_->EnqueueFrame(data, size, user_private_data,
99 buffer_private_data);
100 }
101
DequeueFrame(const DecoderBuffer ** out_ptr)102 StatusCode Decoder::DequeueFrame(const DecoderBuffer** out_ptr) {
103 if (impl_ == nullptr) return kStatusNotInitialized;
104 return impl_->DequeueFrame(out_ptr);
105 }
106
SignalEOS()107 StatusCode Decoder::SignalEOS() {
108 if (impl_ == nullptr) return kStatusNotInitialized;
109 // In non-frame-parallel mode, we have to release all the references. This
110 // simply means replacing the |impl_| with a new instance so that all the
111 // existing references are released and the state is cleared.
112 impl_ = nullptr;
113 return DecoderImpl::Create(&settings_, &impl_);
114 }
115
116 // static.
GetMaxBitdepth()117 int Decoder::GetMaxBitdepth() { return DecoderImpl::GetMaxBitdepth(); }
118
119 } // namespace libgav1
120