diff options
-rw-r--r-- | gst/videoparsers/gstmpegvideoparse.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c index 7b6390acc..eef79bc67 100644 --- a/gst/videoparsers/gstmpegvideoparse.c +++ b/gst/videoparsers/gstmpegvideoparse.c @@ -471,20 +471,59 @@ parse_packet_extension (GstMpegvParse * mpvparse, GstMapInfo * info, guint off) /* 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; + if (size < 2) { GST_DEBUG_OBJECT (mpvparse, "user data packet too short, ignoring"); return; } /* A53 part 4 closed captions */ - if (size > 6 && GST_READ_UINT32_BE (data) == A53_USER_DATA_ID_GA94 - && data[4] == A53_USER_DATA_TYPE_CODE_MPEG_CC_DATA - && (data[5] & CEA_708_PROCESS_CC_DATA_FLAG) != 0 && data[6] == 0xff) { + 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; |