diff mbox

[FFmpeg-devel,1/6] avcodec/extract_extradata_bsf: use the parsing code from mpegvideo_split()

Message ID 20170324223147.2692-2-jamrial@gmail.com
State Accepted
Commit ec996163c8dbacf39c1a3d490d0467299af9a0bd
Headers show

Commit Message

James Almer March 24, 2017, 10:31 p.m. UTC
Required by some samples, like PVA_test-partial.pva

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/extract_extradata_bsf.c | 46 ++++++++++++++++++++++++++++++--------
 1 file changed, 37 insertions(+), 9 deletions(-)

Comments

Michael Niedermayer March 26, 2017, 12:48 a.m. UTC | #1
On Fri, Mar 24, 2017 at 07:31:42PM -0300, James Almer wrote:
> Required by some samples, like PVA_test-partial.pva
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavcodec/extract_extradata_bsf.c | 46 ++++++++++++++++++++++++++++++--------
>  1 file changed, 37 insertions(+), 9 deletions(-)

LGTM

thx

[...]
James Almer March 26, 2017, 1:40 a.m. UTC | #2
On 3/25/2017 9:48 PM, Michael Niedermayer wrote:
> On Fri, Mar 24, 2017 at 07:31:42PM -0300, James Almer wrote:
>> Required by some samples, like PVA_test-partial.pva
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>>  libavcodec/extract_extradata_bsf.c | 46 ++++++++++++++++++++++++++++++--------
>>  1 file changed, 37 insertions(+), 9 deletions(-)
> 
> LGTM
> 
> thx

Added missing reference to the commit that fixed the parsing code in
question in mpegvideo_parser.c and pushed. Thanks.
diff mbox

Patch

diff --git a/libavcodec/extract_extradata_bsf.c b/libavcodec/extract_extradata_bsf.c
index 0d11f86304..d909ee6d17 100644
--- a/libavcodec/extract_extradata_bsf.c
+++ b/libavcodec/extract_extradata_bsf.c
@@ -170,19 +170,47 @@  static int extract_extradata_vc1(AVBSFContext *ctx, AVPacket *pkt,
     return 0;
 }
 
-static int extract_extradata_mpeg124(AVBSFContext *ctx, AVPacket *pkt,
+static int extract_extradata_mpeg12(AVBSFContext *ctx, AVPacket *pkt,
                                      uint8_t **data, int *size)
 {
     ExtractExtradataContext *s = ctx->priv_data;
-    int is_mpeg12 = ctx->par_in->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
-                    ctx->par_in->codec_id == AV_CODEC_ID_MPEG2VIDEO;
+    uint32_t state = UINT32_MAX;
+    int i, found = 0;
+
+    for (i = 0; i < pkt->size; i++) {
+        state = (state << 8) | pkt->data[i];
+        if (state == 0x1B3)
+            found = 1;
+        else if (found && state != 0x1B5 && state < 0x200 && state >= 0x100) {
+            if (i > 3) {
+                *size = i - 3;
+                *data = av_malloc(*size + AV_INPUT_BUFFER_PADDING_SIZE);
+                if (!*data)
+                    return AVERROR(ENOMEM);
+
+                memcpy(*data, pkt->data, *size);
+
+                if (s->remove) {
+                    pkt->data += *size;
+                    pkt->size -= *size;
+                }
+            }
+            break;
+        }
+    }
+    return 0;
+}
+
+static int extract_extradata_mpeg4(AVBSFContext *ctx, AVPacket *pkt,
+                                   uint8_t **data, int *size)
+{
+    ExtractExtradataContext *s = ctx->priv_data;
     uint32_t state = UINT32_MAX;
     int i;
 
     for (i = 0; i < pkt->size; i++) {
         state = (state << 8) | pkt->data[i];
-        if ((is_mpeg12 && state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100) ||
-            (!is_mpeg12 && (state == 0x1B3 || state == 0x1B6))) {
+        if ((state == 0x1B3 || state == 0x1B6)) {
             if (i > 3) {
                 *size = i - 3;
                 *data = av_malloc(*size + AV_INPUT_BUFFER_PADDING_SIZE);
@@ -207,12 +235,12 @@  static const struct {
     int (*extract)(AVBSFContext *ctx, AVPacket *pkt,
                    uint8_t **data, int *size);
 } extract_tab[] = {
-    { AV_CODEC_ID_CAVS,       extract_extradata_mpeg124 },
+    { AV_CODEC_ID_CAVS,       extract_extradata_mpeg4   },
     { AV_CODEC_ID_H264,       extract_extradata_h2645   },
     { AV_CODEC_ID_HEVC,       extract_extradata_h2645   },
-    { AV_CODEC_ID_MPEG1VIDEO, extract_extradata_mpeg124 },
-    { AV_CODEC_ID_MPEG2VIDEO, extract_extradata_mpeg124 },
-    { AV_CODEC_ID_MPEG4,      extract_extradata_mpeg124 },
+    { AV_CODEC_ID_MPEG1VIDEO, extract_extradata_mpeg12  },
+    { AV_CODEC_ID_MPEG2VIDEO, extract_extradata_mpeg12  },
+    { AV_CODEC_ID_MPEG4,      extract_extradata_mpeg4   },
     { AV_CODEC_ID_VC1,        extract_extradata_vc1     },
 };