summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst/videoparsers/gstav1parse.c84
1 files changed, 44 insertions, 40 deletions
diff --git a/gst/videoparsers/gstav1parse.c b/gst/videoparsers/gstav1parse.c
index 8c711ef45..d616863e6 100644
--- a/gst/videoparsers/gstav1parse.c
+++ b/gst/videoparsers/gstav1parse.c
@@ -770,19 +770,22 @@ gst_av1_parse_set_sink_caps (GstBaseParse * parse, GstCaps * caps)
static GstFlowReturn
gst_av1_parse_push_data (GstAV1Parse * self, GstBaseParseFrame * frame,
- guint32 finish_sz)
+ guint32 finish_sz, gboolean frame_finished)
{
gsize sz;
GstBuffer *buf;
GstBuffer *buffer = frame->buffer;
GstFlowReturn ret = GST_FLOW_OK;
- g_assert (self->align != self->in_align);
+ /* Need to generate the final TU annex-b format */
if (self->align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) {
guint8 size_data[GST_AV1_MAX_LEB_128_SIZE];
guint size_len = 0;
guint len;
+ /* When push a TU, it must also be a frame end. */
+ g_assert (frame_finished);
+
/* Still some left in the frame cache */
len = gst_adapter_available (self->frame_cache);
if (len) {
@@ -825,13 +828,16 @@ gst_av1_parse_push_data (GstAV1Parse * self, GstBaseParseFrame * frame,
GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT);
self->keyframe = FALSE;
}
- /* Always be a frame boundary. */
- GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_MARKER);
+
+ if (frame_finished)
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_MARKER);
+
gst_buffer_replace (&frame->out_buffer, buf);
gst_buffer_unref (buf);
gst_av1_parse_update_src_caps (self, NULL);
- GST_LOG_OBJECT (self, "complete one frame with size %" G_GSSIZE_FORMAT, sz);
+ GST_LOG_OBJECT (self, "comsumed %d, output one buffer with size %"
+ G_GSSIZE_FORMAT, finish_sz, sz);
ret = gst_base_parse_finish_frame (GST_BASE_PARSE (self), frame, finish_sz);
}
@@ -967,6 +973,33 @@ gst_av1_parse_convert_from_annexb (GstAV1Parse * self, GstAV1OBU * obu)
gst_bit_writer_reset (&bs);
}
+static void
+gst_av1_parse_cache_one_obu (GstAV1Parse * self, GstAV1OBU * obu,
+ guint8 * data, guint32 size, gboolean frame_complete)
+{
+ gboolean need_convert = FALSE;
+ GstBuffer *buf;
+
+ if (self->in_align != self->align
+ && (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B
+ || self->align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B))
+ need_convert = TRUE;
+
+ if (need_convert) {
+ if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) {
+ gst_av1_parse_convert_from_annexb (self, obu);
+ } else {
+ gst_av1_parse_convert_to_annexb (self, obu, frame_complete);
+ }
+ } else if (self->align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) {
+ g_assert (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B);
+ gst_av1_parse_convert_to_annexb (self, obu, frame_complete);
+ } else {
+ buf = gst_buffer_new_wrapped (g_memdup (data, size), size);
+ gst_adapter_push (self->cache_out, buf);
+ }
+}
+
static GstAV1ParserResult
gst_av1_parse_handle_sequence_obu (GstAV1Parse * self, GstAV1OBU * obu)
{
@@ -1276,7 +1309,6 @@ gst_av1_parse_handle_to_small_and_equal_align (GstBaseParse * parse,
GstAV1ParserResult res;
GstBuffer *buffer = gst_buffer_ref (frame->buffer);
guint32 total_consumed, consumed;
- gboolean need_convert = FALSE;
gboolean frame_complete;
if (!gst_buffer_map (buffer, &map_info, GST_MAP_READ)) {
@@ -1284,11 +1316,6 @@ gst_av1_parse_handle_to_small_and_equal_align (GstBaseParse * parse,
return GST_FLOW_ERROR;
}
- if (self->in_align != self->align
- && (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B
- || self->align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B))
- need_convert = TRUE;
-
total_consumed = 0;
frame_complete = FALSE;
again:
@@ -1309,15 +1336,10 @@ again:
break;
}
- total_consumed += consumed;
+ gst_av1_parse_cache_one_obu (self, &obu,
+ map_info.data + total_consumed, consumed, frame_complete);
- if (need_convert) {
- if (self->in_align == GST_AV1_PARSE_ALIGN_TEMPORAL_UNIT_ANNEX_B) {
- gst_av1_parse_convert_from_annexb (self, &obu);
- } else {
- gst_av1_parse_convert_to_annexb (self, &obu, frame_complete);
- }
- }
+ total_consumed += consumed;
if (self->align == GST_AV1_PARSE_ALIGN_FRAME && frame_complete)
break;
@@ -1362,26 +1384,7 @@ again:
gst_av1_parse_alignment_to_string (self->in_align));
}
- if (!need_convert) {
- gst_av1_parse_update_src_caps (self, NULL);
- if (self->discont) {
- GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
- self->discont = FALSE;
- }
- if (self->header) {
- GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_HEADER);
- self->header = FALSE;
- }
- if (self->keyframe) {
- GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT);
- self->keyframe = FALSE;
- }
- /* Always be a frame boundary. */
- GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_MARKER);
- ret = gst_base_parse_finish_frame (parse, frame, total_consumed);
- } else {
- ret = gst_av1_parse_push_data (self, frame, total_consumed);
- }
+ ret = gst_av1_parse_push_data (self, frame, total_consumed, frame_complete);
out:
gst_buffer_unmap (buffer, &map_info);
@@ -1455,7 +1458,8 @@ again:
/* push the left anyway if no error */
if (res == GST_AV1_PARSER_OK)
- ret = gst_av1_parse_push_data (self, frame, self->last_parsed_offset);
+ ret = gst_av1_parse_push_data (self, frame,
+ self->last_parsed_offset, TRUE);
self->last_parsed_offset = 0;