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