[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