]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/pgssubdec.c
avformat/audiointerleave: only keep the retime functionality of the audio interleaver
[ffmpeg] / libavcodec / pgssubdec.c
index 8c10f6d5733138e8ed0b6557214ead79e1822ef5..9c59a2297f17f7daceccb6351d1f0fecd9a2dfde 100644 (file)
@@ -614,7 +614,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
     return 1;
 }
 
-static int decode(AVCodecContext *avctx, void *data, int *data_size,
+static int decode(AVCodecContext *avctx, void *data, int *got_sub_ptr,
                   AVPacket *avpkt)
 {
     const uint8_t *buf = avpkt->data;
@@ -636,7 +636,7 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size,
     if (i & 15)
         ff_dlog(avctx, "\n");
 
-    *data_size = 0;
+    *got_sub_ptr = 0;
 
     /* Ensure that we have received at a least a segment code and segment length */
     if (buf_size < 3)
@@ -676,14 +676,14 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size,
              */
             break;
         case DISPLAY_SEGMENT:
-            if (*data_size) {
+            if (*got_sub_ptr) {
                 av_log(avctx, AV_LOG_ERROR, "Duplicate display segment\n");
                 ret = AVERROR_INVALIDDATA;
                 break;
             }
             ret = display_end_segment(avctx, data, buf, segment_length);
             if (ret >= 0)
-                *data_size = ret;
+                *got_sub_ptr = ret;
             break;
         default:
             av_log(avctx, AV_LOG_ERROR, "Unknown subtitle segment type 0x%x, length %d\n",
@@ -691,8 +691,11 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size,
             ret = AVERROR_INVALIDDATA;
             break;
         }
-        if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
+        if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) {
+            avsubtitle_free(data);
+            *got_sub_ptr = 0;
             return ret;
+        }
 
         buf += segment_length;
     }