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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".