[FFmpeg-devel] [PATCH] mpeg12enc: Use all Closed Captions side data
Mathieu Duponchelle
mathieu at centricular.com
Sat Mar 23 01:22:05 EET 2019
It is perfectly valid to have multiple CC Picture User Data
for the same frame. Instead of using the first side_data
potentially present with the A53_CC type, iterate over all
side_data.
---
libavcodec/mpeg12enc.c | 56 +++++++++++++++++++++++-------------------
1 file changed, 31 insertions(+), 25 deletions(-)
diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
index 2bc5289d63..0162939399 100644
--- a/libavcodec/mpeg12enc.c
+++ b/libavcodec/mpeg12enc.c
@@ -547,31 +547,37 @@ void ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number)
}
if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && s->a53_cc) {
- side_data = av_frame_get_side_data(s->current_picture_ptr->f,
- AV_FRAME_DATA_A53_CC);
- if (side_data) {
- if (side_data->size <= A53_MAX_CC_COUNT * 3 && side_data->size % 3 == 0) {
- int i = 0;
-
- put_header (s, USER_START_CODE);
-
- put_bits(&s->pb, 8, 'G'); // user_identifier
- put_bits(&s->pb, 8, 'A');
- put_bits(&s->pb, 8, '9');
- put_bits(&s->pb, 8, '4');
- put_bits(&s->pb, 8, 3); // user_data_type_code
- put_bits(&s->pb, 8,
- (side_data->size / 3 & A53_MAX_CC_COUNT) | 0x40); // flags, cc_count
- put_bits(&s->pb, 8, 0xff); // em_data
-
- for (i = 0; i < side_data->size; i++)
- put_bits(&s->pb, 8, side_data->data[i]);
-
- put_bits(&s->pb, 8, 0xff); // marker_bits
- } else {
- av_log(s->avctx, AV_LOG_WARNING,
- "Warning Closed Caption size (%d) can not exceed 93 bytes "
- "and must be a multiple of 3\n", side_data->size);
+ int i;
+
+ for (i = 0; i < s->current_picture_ptr->f->nb_side_data; i++) {
+ side_data = s->current_picture_ptr->f->side_data[i];
+ if (side_data->type != AV_FRAME_DATA_A53_CC)
+ continue;
+
+ if (side_data) {
+ if (side_data->size <= A53_MAX_CC_COUNT * 3 && side_data->size % 3 == 0) {
+ int i = 0;
+
+ put_header (s, USER_START_CODE);
+
+ put_bits(&s->pb, 8, 'G'); // user_identifier
+ put_bits(&s->pb, 8, 'A');
+ put_bits(&s->pb, 8, '9');
+ put_bits(&s->pb, 8, '4');
+ put_bits(&s->pb, 8, 3); // user_data_type_code
+ put_bits(&s->pb, 8,
+ (side_data->size / 3 & A53_MAX_CC_COUNT) | 0x40); // flags, cc_count
+ put_bits(&s->pb, 8, 0xff); // em_data
+
+ for (i = 0; i < side_data->size; i++)
+ put_bits(&s->pb, 8, side_data->data[i]);
+
+ put_bits(&s->pb, 8, 0xff); // marker_bits
+ } else {
+ av_log(s->avctx, AV_LOG_WARNING,
+ "Warning Closed Caption size (%d) can not exceed 93 bytes "
+ "and must be a multiple of 3\n", side_data->size);
+ }
}
}
}
--
2.20.1
More information about the ffmpeg-devel
mailing list