xref: /aosp_15_r20/external/libgav1/src/decoder.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
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