h264/h265parse: Add VideoTimeCodeMeta to the outgoing buffer

The parsers attempted to add the meta to the incoming buffer, which
might not be the outgoing buffer or may not have been writable yet.

To fix this, call `gst_buffer_make_writable` earlier and make sure to
use the `parse_buffer` to add the meta.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1521

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2002>
This commit is contained in:
Jan Alexander Steffens (heftig) 2021-02-02 18:25:31 +01:00
parent 956d6e8ff7
commit 0f084d4624
2 changed files with 17 additions and 17 deletions

View file

@ -3134,7 +3134,14 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
}
#endif
if (!gst_buffer_get_video_time_code_meta (buffer)) {
if (frame->out_buffer) {
parse_buffer = frame->out_buffer =
gst_buffer_make_writable (frame->out_buffer);
} else {
parse_buffer = frame->buffer = gst_buffer_make_writable (frame->buffer);
}
if (!gst_buffer_get_video_time_code_meta (parse_buffer)) {
guint i = 0;
for (i = 0; i < 3 && h264parse->num_clock_timestamp; i++) {
@ -3197,7 +3204,7 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
"Add time code meta %02u:%02u:%02u:%02u",
tim->hours_value, tim->minutes_value, tim->seconds_value, n_frames);
gst_buffer_add_video_time_code_meta_full (buffer,
gst_buffer_add_video_time_code_meta_full (parse_buffer,
h264parse->parsed_fps_n,
h264parse->parsed_fps_d,
NULL,
@ -3210,13 +3217,6 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
h264parse->num_clock_timestamp = 0;
}
if (frame->out_buffer) {
parse_buffer = frame->out_buffer =
gst_buffer_make_writable (frame->out_buffer);
} else {
parse_buffer = frame->buffer = gst_buffer_make_writable (frame->buffer);
}
if (is_interlaced) {
GST_BUFFER_FLAG_SET (parse_buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED);
if (h264parse->sei_pic_struct == GST_H264_SEI_PIC_STRUCT_TOP_FIELD)

View file

@ -2748,6 +2748,13 @@ gst_h265_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
}
}
if (frame->out_buffer) {
parse_buffer = frame->out_buffer =
gst_buffer_make_writable (frame->out_buffer);
} else {
parse_buffer = frame->buffer = gst_buffer_make_writable (frame->buffer);
}
{
guint i = 0;
@ -2809,7 +2816,7 @@ gst_h265_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
gst_util_uint64_scale_int (h265parse->time_code.n_frames[i], 1,
2 - h265parse->time_code.units_field_based_flag[i]);
gst_buffer_add_video_time_code_meta_full (buffer,
gst_buffer_add_video_time_code_meta_full (parse_buffer,
h265parse->parsed_fps_n,
h265parse->parsed_fps_d,
NULL,
@ -2823,13 +2830,6 @@ gst_h265_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
}
}
if (frame->out_buffer) {
parse_buffer = frame->out_buffer =
gst_buffer_make_writable (frame->out_buffer);
} else {
parse_buffer = frame->buffer = gst_buffer_make_writable (frame->buffer);
}
if (h265parse->sei_pic_struct != GST_H265_SEI_PIC_STRUCT_FRAME) {
GST_BUFFER_FLAG_SET (parse_buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED);
if (h265parse->sei_pic_struct == GST_H265_SEI_PIC_STRUCT_TOP_FIELD)