diff options
Diffstat (limited to 'libgav1/src/decoder.cc')
-rw-r--r-- | libgav1/src/decoder.cc | 91 |
1 files changed, 79 insertions, 12 deletions
diff --git a/libgav1/src/decoder.cc b/libgav1/src/decoder.cc index 9a38dd1..b9e43e0 100644 --- a/libgav1/src/decoder.cc +++ b/libgav1/src/decoder.cc @@ -12,10 +12,73 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "src/decoder.h" +#include "src/gav1/decoder.h" + +#include <memory> +#include <new> #include "src/decoder_impl.h" +extern "C" { + +Libgav1StatusCode Libgav1DecoderCreate(const Libgav1DecoderSettings* settings, + Libgav1Decoder** decoder_out) { + std::unique_ptr<libgav1::Decoder> cxx_decoder(new (std::nothrow) + libgav1::Decoder()); + if (cxx_decoder == nullptr) return kLibgav1StatusOutOfMemory; + + libgav1::DecoderSettings cxx_settings; + cxx_settings.threads = settings->threads; + cxx_settings.frame_parallel = settings->frame_parallel != 0; + cxx_settings.blocking_dequeue = settings->blocking_dequeue != 0; + cxx_settings.on_frame_buffer_size_changed = + settings->on_frame_buffer_size_changed; + cxx_settings.get_frame_buffer = settings->get_frame_buffer; + cxx_settings.release_frame_buffer = settings->release_frame_buffer; + cxx_settings.release_input_buffer = settings->release_input_buffer; + cxx_settings.callback_private_data = settings->callback_private_data; + cxx_settings.output_all_layers = settings->output_all_layers != 0; + cxx_settings.operating_point = settings->operating_point; + cxx_settings.post_filter_mask = settings->post_filter_mask; + + const Libgav1StatusCode status = cxx_decoder->Init(&cxx_settings); + if (status == kLibgav1StatusOk) { + *decoder_out = reinterpret_cast<Libgav1Decoder*>(cxx_decoder.release()); + } + return status; +} + +void Libgav1DecoderDestroy(Libgav1Decoder* decoder) { + auto* cxx_decoder = reinterpret_cast<libgav1::Decoder*>(decoder); + delete cxx_decoder; +} + +Libgav1StatusCode Libgav1DecoderEnqueueFrame(Libgav1Decoder* decoder, + const uint8_t* data, size_t size, + int64_t user_private_data, + void* buffer_private_data) { + auto* cxx_decoder = reinterpret_cast<libgav1::Decoder*>(decoder); + return cxx_decoder->EnqueueFrame(data, size, user_private_data, + buffer_private_data); +} + +Libgav1StatusCode Libgav1DecoderDequeueFrame( + Libgav1Decoder* decoder, const Libgav1DecoderBuffer** out_ptr) { + auto* cxx_decoder = reinterpret_cast<libgav1::Decoder*>(decoder); + return cxx_decoder->DequeueFrame(out_ptr); +} + +Libgav1StatusCode Libgav1DecoderSignalEOS(Libgav1Decoder* decoder) { + auto* cxx_decoder = reinterpret_cast<libgav1::Decoder*>(decoder); + return cxx_decoder->SignalEOS(); +} + +int Libgav1DecoderGetMaxBitdepth() { + return libgav1::Decoder::GetMaxBitdepth(); +} + +} // extern "C" + namespace libgav1 { Decoder::Decoder() = default; @@ -23,27 +86,31 @@ Decoder::Decoder() = default; Decoder::~Decoder() = default; StatusCode Decoder::Init(const DecoderSettings* const settings) { - if (initialized_) return kLibgav1StatusAlready; + if (impl_ != nullptr) return kStatusAlready; if (settings != nullptr) settings_ = *settings; - const StatusCode status = DecoderImpl::Create(&settings_, &impl_); - if (status != kLibgav1StatusOk) return status; - initialized_ = true; - return kLibgav1StatusOk; + return DecoderImpl::Create(&settings_, &impl_); } StatusCode Decoder::EnqueueFrame(const uint8_t* data, const size_t size, - int64_t user_private_data) { - if (!initialized_) return kLibgav1StatusNotInitialized; - return impl_->EnqueueFrame(data, size, user_private_data); + int64_t user_private_data, + void* buffer_private_data) { + if (impl_ == nullptr) return kStatusNotInitialized; + return impl_->EnqueueFrame(data, size, user_private_data, + buffer_private_data); } StatusCode Decoder::DequeueFrame(const DecoderBuffer** out_ptr) { - if (!initialized_) return kLibgav1StatusNotInitialized; + if (impl_ == nullptr) return kStatusNotInitialized; return impl_->DequeueFrame(out_ptr); } -int Decoder::GetMaxAllowedFrames() const { - return settings_.frame_parallel ? settings_.threads : 1; +StatusCode Decoder::SignalEOS() { + if (impl_ == nullptr) return kStatusNotInitialized; + // In non-frame-parallel mode, we have to release all the references. This + // simply means replacing the |impl_| with a new instance so that all the + // existing references are released and the state is cleared. + impl_ = nullptr; + return DecoderImpl::Create(&settings_, &impl_); } // static. |