diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c index 59789fc71d..3eb759d84b 100644 --- a/gst/videoparsers/gstmpegvideoparse.c +++ b/gst/videoparsers/gstmpegvideoparse.c @@ -461,93 +461,20 @@ parse_packet_extension (GstMpegvParse * mpvparse, GstMapInfo * info, guint off) } } -/* A53-4 Table 6.7 */ -#define A53_USER_DATA_ID_GA94 0x47413934 -#define A53_USER_DATA_ID_DTG1 0x44544731 - -/* A53-4 Table 6.9 */ -#define A53_USER_DATA_TYPE_CODE_MPEG_CC_DATA 0x03 -#define A53_USER_DATA_TYPE_CODE_BAR_DATA 0x06 - -/* CEA-708 Table 2 */ -#define CEA_708_PROCESS_CC_DATA_FLAG 0x40 -#define CEA_708_PROCESS_EM_DATA_FLAG 0x80 - static void parse_user_data_packet (GstMpegvParse * mpvparse, const guint8 * data, guint size) { - gboolean a53_user_data_ga94 = FALSE; - gboolean a53_user_data_dtg1 = FALSE; - gboolean a53_user_data_mpeg_cc = FALSE; - gboolean a53_process_708_cc_data = FALSE; - gboolean process_708_em_data = FALSE; + GstByteReader br; + GstVideoParseUtilsField field = GST_VIDEO_PARSE_UTILS_FIELD_1; + gst_byte_reader_init (&br, data, size); - if (size < 2) { - GST_DEBUG_OBJECT (mpvparse, "user data packet too short, ignoring"); - return; - } + if (mpvparse->picext.picture_structure == + (guint8) GST_MPEG_VIDEO_PICTURE_STRUCTURE_BOTTOM_FIELD) + field = GST_VIDEO_PARSE_UTILS_FIELD_2; + gst_video_parse_user_data ((GstElement *) mpvparse, &mpvparse->user_data, &br, + field, ITU_T_T35_MANUFACTURER_US_ATSC); - /* A53 part 4 closed captions */ - if (size > 6) { - guint32 user_data_id = GST_READ_UINT32_BE (data); - a53_user_data_ga94 = user_data_id == A53_USER_DATA_ID_GA94; - a53_user_data_dtg1 = user_data_id == A53_USER_DATA_ID_DTG1; - a53_user_data_mpeg_cc = data[4] == A53_USER_DATA_TYPE_CODE_MPEG_CC_DATA; - a53_process_708_cc_data = (data[5] & CEA_708_PROCESS_CC_DATA_FLAG) != 0; - process_708_em_data = (data[5] & CEA_708_PROCESS_EM_DATA_FLAG) != 0; - - if (a53_user_data_dtg1) { - GST_DEBUG_OBJECT (mpvparse, - "ignoring closed captions as DTG1 is not supported"); - } else if (a53_user_data_ga94) { - GST_DEBUG_OBJECT (mpvparse, "GA94 closed captions"); - if (!a53_user_data_mpeg_cc) { - GST_DEBUG_OBJECT (mpvparse, - "ignoring closed captions as A53_USER_DATA_TYPE_CODE_MPEG_CC_DATA is not set"); - } - if (!a53_process_708_cc_data) { - GST_DEBUG_OBJECT (mpvparse, - "ignoring closed captions as CEA_708_PROCESS_CC_DATA_FLAG is not set"); - } - if (!process_708_em_data) { - GST_DEBUG_OBJECT (mpvparse, - "CEA_708_PROCESS_EM_DATA_FLAG flag is not set"); - } - /* ignore em data flag for now as it breaks one of the tests */ - process_708_em_data = /*process_708_em_data && */ (data[6] == 0xff); - if (!process_708_em_data) { - GST_DEBUG_OBJECT (mpvparse, - "ignoring closed captions as em data does not equal 0xFF"); - } - } - } - if (size > 6 && a53_user_data_ga94 && a53_user_data_mpeg_cc - && a53_process_708_cc_data && process_708_em_data) { - guint8 cc_count = data[5] & 0x1f; - guint cc_size = cc_count * 3; - - data += 7; - size -= 7; - - if (cc_size == 0 || cc_size > size) { - GST_DEBUG_OBJECT (mpvparse, "ignoring closed captions, not enough data"); - return; - } - - /* Shouldn't really happen so let's not go out of our way to handle it */ - if (mpvparse->closedcaptions_size > 0) - GST_WARNING_OBJECT (mpvparse, "unused pending closed captions!"); - - g_assert (cc_size <= sizeof (mpvparse->closedcaptions)); - memcpy (mpvparse->closedcaptions, data, cc_size); - mpvparse->closedcaptions_size = cc_size; - mpvparse->closedcaptions_type = GST_VIDEO_CAPTION_TYPE_CEA708_RAW; - GST_DEBUG_OBJECT (mpvparse, "CEA-708 closed captions, %u bytes", cc_size); - return; - } - - GST_MEMDUMP_OBJECT (mpvparse, "unhandled user data packet", data, size); } /* caller guarantees at least start code in @buf at @off ( - 4)*/ @@ -1040,6 +967,7 @@ gst_mpegv_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) GstMpegVideoPictureHdr *pic_hdr = NULL; GstMpegVideoPictureExt *pic_ext = NULL; GstMpegVideoQuantMatrixExt *quant_ext = NULL; + GstBuffer *parse_buffer = NULL; /* tag sending done late enough in hook to ensure pending events * have already been sent */ @@ -1105,23 +1033,21 @@ gst_mpegv_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) meta->slice_offset = mpvparse->slice_offset; } - if (mpvparse->closedcaptions_size > 0) { - GstBuffer *buf; - - if (frame->out_buffer) { - buf = frame->out_buffer = gst_buffer_make_writable (frame->out_buffer); - } else { - buf = frame->buffer = gst_buffer_make_writable (frame->buffer); - } - - gst_buffer_add_video_caption_meta (buf, - mpvparse->closedcaptions_type, mpvparse->closedcaptions, - mpvparse->closedcaptions_size); - - mpvparse->closedcaptions_type = GST_VIDEO_CAPTION_TYPE_UNKNOWN; - mpvparse->closedcaptions_size = 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 (pic_ext && !pic_ext->progressive_frame) { + GST_BUFFER_FLAG_SET (parse_buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED); + if (pic_ext->top_field_first) + GST_BUFFER_FLAG_SET (parse_buffer, GST_VIDEO_BUFFER_FLAG_TFF); + } + gst_video_push_user_data ((GstElement *) mpvparse, &mpvparse->user_data, + parse_buffer); + return GST_FLOW_OK; } diff --git a/gst/videoparsers/gstmpegvideoparse.h b/gst/videoparsers/gstmpegvideoparse.h index ed9dcce3c4..4052bebb21 100644 --- a/gst/videoparsers/gstmpegvideoparse.h +++ b/gst/videoparsers/gstmpegvideoparse.h @@ -27,7 +27,7 @@ #include #include - +#include "gstvideoparseutils.h" #include G_BEGIN_DECLS @@ -87,10 +87,7 @@ struct _GstMpegvParse { gboolean picext_updated; gboolean quantmatrext_updated; - /* pending closed captions */ - guint8 closedcaptions[96]; - guint closedcaptions_size; - GstVideoCaptionType closedcaptions_type; + GstVideoParseUserData user_data; /* properties */ gboolean drop;