Commit e8daabb7 for libheif
commit e8daabb79e9a4ba9e32a9ae79c8a1ce74c2395cb
Author: Dirk Farin <dirk.farin@gmail.com>
Date: Tue Jan 13 01:46:56 2026 +0100
openh264 decoder: pass frame-number through SBufferInfo (#1661)
diff --git a/libheif/plugins/decoder_openh264.cc b/libheif/plugins/decoder_openh264.cc
index e6ae11ed..cf49a955 100644
--- a/libheif/plugins/decoder_openh264.cc
+++ b/libheif/plugins/decoder_openh264.cc
@@ -40,7 +40,7 @@ struct openh264_decoder
struct Packet
{
std::vector<uint8_t> data;
- // uintptr_t pts; currently unused
+ uintptr_t pts;
};
std::deque<Packet> input_data;
@@ -52,7 +52,6 @@ struct openh264_decoder
// --- decoder
ISVCDecoder* decoder = nullptr;
- int fake_output_framenumber = 0;
~openh264_decoder()
{
@@ -174,7 +173,7 @@ void openh264_set_strict_decoding(void* decoder_raw, int flag)
}
-heif_error openh264_push_data(void* decoder_raw, const void* frame_data, size_t frame_size)
+heif_error openh264_push_data2(void* decoder_raw, const void* frame_data, size_t frame_size, uintptr_t user_data)
{
auto* decoder = (openh264_decoder*) decoder_raw;
@@ -184,19 +183,21 @@ heif_error openh264_push_data(void* decoder_raw, const void* frame_data, size_t
openh264_decoder::Packet pkt;
pkt.data.insert(pkt.data.end(), input_data, input_data + frame_size);
+ pkt.pts = user_data;
decoder->input_data.push_back(std::move(pkt));
return {heif_error_Ok, heif_suberror_Unspecified, kSuccess};
}
-heif_error openh264_push_data2(void* decoder_raw, const void* frame_data, size_t frame_size, uintptr_t user_data)
+heif_error openh264_push_data(void* decoder_raw, const void* frame_data, size_t frame_size)
{
- return openh264_push_data(decoder_raw, frame_data, frame_size);
+ return openh264_push_data2(decoder_raw, frame_data, frame_size, 0);
}
-heif_error openh264_decode_next_image(void* decoder_raw, heif_image** out_img,
- const heif_security_limits* limits)
+heif_error openh264_decode_next_image2(void* decoder_raw, heif_image** out_img,
+ uintptr_t* out_user_data,
+ const heif_security_limits* limits)
{
auto* decoder = (openh264_decoder*) decoder_raw;
ISVCDecoder* pSvcDecoder = decoder->decoder;
@@ -219,8 +220,9 @@ heif_error openh264_decode_next_image(void* decoder_raw, heif_image** out_img,
int iRet;
-
if (!decoder->input_data.empty()) {
+ sDstBufInfo.uiInBsTimeStamp = decoder->input_data.front().pts;
+
const std::vector<uint8_t>& indata = decoder->input_data.front().data;
std::vector<uint8_t> scdata;
@@ -311,6 +313,10 @@ heif_error openh264_decode_next_image(void* decoder_raw, heif_image** out_img,
return heif_error_ok;
}
+ if (out_user_data) {
+ *out_user_data = sDstBufInfo.uiOutYuvTimeStamp;
+ }
+
/*
// TODO: I receive an iBufferStatus==0, but the output image is still decoded
if (sDstBufInfo.iBufferStatus == 0) {
@@ -405,27 +411,11 @@ heif_error openh264_decode_next_image(void* decoder_raw, heif_image** out_img,
return heif_error_ok;
}
-heif_error openh264_decode_next_image2(void* decoder_raw, heif_image** out_img,
- uintptr_t* out_user_data,
- const heif_security_limits* limits)
-{
- auto* decoder = (struct openh264_decoder*) decoder_raw;
-
- heif_error err = openh264_decode_next_image(decoder_raw, out_img, limits);
-
- if (!err.code && out_user_data) {
-
- // TODO: openH264 does not support passing through frame numbers. Assume that there is no frame reordering.
- if (*out_img) {
- *out_user_data = decoder->fake_output_framenumber++;
- }
- else {
- *out_user_data = 0;
- }
- }
-
- return err;
+heif_error openh264_decode_next_image(void* decoder_raw, heif_image** out_img,
+ const heif_security_limits* limits)
+{
+ return openh264_decode_next_image2(decoder_raw, out_img, nullptr, limits);
}
heif_error openh264_decode_image(void* decoder_raw, heif_image** out_img)