{"body":"diff --git a/libavcodec/h2645_parse.c b/libavcodec/h2645_parse.c\nindex 3fbbaf4d29..da85798d65 100644\n--- a/libavcodec/h2645_parse.c\n+++ b/libavcodec/h2645_parse.c\n@@ -31,11 +31,11 @@\n #include \"h2645_parse.h\"\n \n int ff_h2645_extract_rbsp(const uint8_t *src, int length,\n-                          H2645NAL *nal, int small_padding)\n+                          H2645RBSP *rbsp, H2645NAL *nal, int small_padding)\n {\n     int i, si, di;\n-    uint8_t *dst;\n-    int64_t padding = small_padding ? 0 : MAX_MBPAIR_SIZE;\n+    uint8_t *dst, *tmp;\n+    int64_t padding = small_padding ? AV_INPUT_BUFFER_PADDING_SIZE : MAX_MBPAIR_SIZE;\n \n     nal->skipped_bytes = 0;\n #define STARTCODE_TEST                                                  \\\n@@ -92,10 +92,15 @@ int ff_h2645_extract_rbsp(const uint8_t *src, int length,\n     } else if (i > length)\n         i = length;\n \n-    av_fast_padded_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size,\n-                          length + padding);\n-    if (!nal->rbsp_buffer)\n+    tmp = av_fast_realloc(rbsp->rbsp_buffer, &rbsp->rbsp_buffer_alloc_size,\n+                          rbsp->rbsp_buffer_size + length + padding);\n+    if (!tmp) {\n+        av_freep(&rbsp->rbsp_buffer);\n         return AVERROR(ENOMEM);\n+    }\n+    rbsp->rbsp_buffer = tmp;\n+    nal->rbsp_buffer = &rbsp->rbsp_buffer[rbsp->rbsp_buffer_size];\n+    rbsp->rbsp_buffer_size += length + padding;\n \n     dst = nal->rbsp_buffer;\n \n@@ -273,6 +278,8 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,\n \n     bytestream2_init(&bc, buf, length);\n \n+    pkt->rbsp.rbsp_buffer_size = 0;\n+\n     pkt->nb_nals = 0;\n     while (bytestream2_get_bytes_left(&bc) >= 4) {\n         H2645NAL *nal;\n@@ -341,7 +348,7 @@ int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,\n         }\n         nal = &pkt->nals[pkt->nb_nals];\n \n-        consumed = ff_h2645_extract_rbsp(bc.buffer, extract_length, nal, small_padding);\n+        consumed = ff_h2645_extract_rbsp(bc.buffer, extract_length, &pkt->rbsp, nal, small_padding);\n         if (consumed < 0)\n             return consumed;\n \n@@ -385,9 +392,10 @@ void ff_h2645_packet_uninit(H2645Packet *pkt)\n {\n     int i;\n     for (i = 0; i < pkt->nals_allocated; i++) {\n-        av_freep(&pkt->nals[i].rbsp_buffer);\n         av_freep(&pkt->nals[i].skipped_bytes_pos);\n     }\n     av_freep(&pkt->nals);\n     pkt->nals_allocated = 0;\n+    av_freep(&pkt->rbsp.rbsp_buffer);\n+    pkt->rbsp.rbsp_buffer_alloc_size = pkt->rbsp.rbsp_buffer_size = 0;\n }\ndiff --git a/libavcodec/h2645_parse.h b/libavcodec/h2645_parse.h\nindex 5f3e17a0f2..2e29ad26cb 100644\n--- a/libavcodec/h2645_parse.h\n+++ b/libavcodec/h2645_parse.h\n@@ -30,7 +30,6 @@\n \n typedef struct H2645NAL {\n     uint8_t *rbsp_buffer;\n-    int rbsp_buffer_size;\n \n     int size;\n     const uint8_t *data;\n@@ -65,9 +64,16 @@ typedef struct H2645NAL {\n     int ref_idc;\n } H2645NAL;\n \n+typedef struct H2645RBSP {\n+    uint8_t *rbsp_buffer;\n+    int rbsp_buffer_alloc_size;\n+    int rbsp_buffer_size;\n+} H2645RBSP;\n+\n /* an input packet split into unescaped NAL units */\n typedef struct H2645Packet {\n     H2645NAL *nals;\n+    H2645RBSP rbsp;\n     int nb_nals;\n     int nals_allocated;\n } H2645Packet;\n@@ -75,7 +81,7 @@ typedef struct H2645Packet {\n /**\n  * Extract the raw (unescaped) bitstream.\n  */\n-int ff_h2645_extract_rbsp(const uint8_t *src, int length,\n+int ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp,\n                           H2645NAL *nal, int small_padding);\n \n /**\ndiff --git a/libavcodec/h264_parse.c b/libavcodec/h264_parse.c\nindex a7c71d9bbb..2ddbbf99f3 100644\n--- a/libavcodec/h264_parse.c\n+++ b/libavcodec/h264_parse.c\n@@ -349,7 +349,8 @@ int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc,\n static int decode_extradata_ps(const uint8_t *data, int size, H264ParamSets *ps,\n                                int is_avc, void *logctx)\n {\n-    H2645Packet pkt = { 0 };\n+    H2645Packet pkt;\n+    memset(&pkt, 0, sizeof(pkt));\n     int i, ret = 0;\n \n     ret = ff_h2645_packet_split(&pkt, data, size, logctx, is_avc, 2, AV_CODEC_ID_H264, 1);\ndiff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c\nindex dd0a965af0..d3d03e3c31 100644\n--- a/libavcodec/h264_parser.c\n+++ b/libavcodec/h264_parser.c\n@@ -243,6 +243,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,\n                                   const uint8_t * const buf, int buf_size)\n {\n     H264ParseContext *p = s->priv_data;\n+    H2645RBSP rbsp = { NULL };\n     H2645NAL nal = { NULL };\n     int buf_index, next_avc;\n     unsigned int pps_id;\n@@ -300,7 +301,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,\n             }\n             break;\n         }\n-        consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &nal, 1);\n+        consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, &rbsp, &nal, 1);\n         if (consumed < 0)\n             break;\n \n@@ -544,18 +545,18 @@ static inline int parse_nal_units(AVCodecParserContext *s,\n                 p->last_frame_num = p->poc.frame_num;\n             }\n \n-            av_freep(&nal.rbsp_buffer);\n+            av_freep(&rbsp.rbsp_buffer);\n             return 0; /* no need to evaluate the rest */\n         }\n     }\n     if (q264) {\n-        av_freep(&nal.rbsp_buffer);\n+        av_freep(&rbsp.rbsp_buffer);\n         return 0;\n     }\n     /* didn't find a picture! */\n     av_log(avctx, AV_LOG_ERROR, \"missing picture in access unit with size %d\\n\", buf_size);\n fail:\n-    av_freep(&nal.rbsp_buffer);\n+    av_freep(&rbsp.rbsp_buffer);\n     return -1;\n }\n \ndiff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c\nindex b0e5ace7c7..23e238846e 100644\n--- a/libavcodec/qsvenc_hevc.c\n+++ b/libavcodec/qsvenc_hevc.c\n@@ -56,6 +56,7 @@ static int generate_fake_vps(QSVEncContext *q, AVCodecContext *avctx)\n     PutByteContext pbc;\n \n     GetBitContext gb;\n+    H2645RBSP sps_rbsp = { NULL };\n     H2645NAL sps_nal = { NULL };\n     HEVCSPS sps = { 0 };\n     HEVCVPS vps = { 0 };\n@@ -70,7 +71,7 @@ static int generate_fake_vps(QSVEncContext *q, AVCodecContext *avctx)\n     }\n \n     /* parse the SPS */\n-    ret = ff_h2645_extract_rbsp(avctx->extradata + 4, avctx->extradata_size - 4, &sps_nal, 1);\n+    ret = ff_h2645_extract_rbsp(avctx->extradata + 4, avctx->extradata_size - 4, &sps_rbsp, &sps_nal, 1);\n     if (ret < 0) {\n         av_log(avctx, AV_LOG_ERROR, \"Error unescaping the SPS buffer\\n\");\n         return ret;\n@@ -78,7 +79,7 @@ static int generate_fake_vps(QSVEncContext *q, AVCodecContext *avctx)\n \n     ret = init_get_bits8(&gb, sps_nal.data, sps_nal.size);\n     if (ret < 0) {\n-        av_freep(&sps_nal.rbsp_buffer);\n+        av_freep(&sps_rbsp.rbsp_buffer);\n         return ret;\n     }\n \n@@ -87,13 +88,13 @@ static int generate_fake_vps(QSVEncContext *q, AVCodecContext *avctx)\n     if (type != HEVC_NAL_SPS) {\n         av_log(avctx, AV_LOG_ERROR, \"Unexpected NAL type in the extradata: %d\\n\",\n                type);\n-        av_freep(&sps_nal.rbsp_buffer);\n+        av_freep(&sps_rbsp.rbsp_buffer);\n         return AVERROR_INVALIDDATA;\n     }\n     get_bits(&gb, 9);\n \n     ret = ff_hevc_parse_sps(&sps, &gb, &sps_id, 0, NULL, avctx);\n-    av_freep(&sps_nal.rbsp_buffer);\n+    av_freep(&sps_rbsp.rbsp_buffer);\n     if (ret < 0) {\n         av_log(avctx, AV_LOG_ERROR, \"Error parsing the SPS\\n\");\n         return ret;\n","name":"","extension":"diff","url":"https://www.irccloud.com/pastebin/qobTcW9d","modified":1509660519,"id":"qobTcW9d","size":7349,"lines":209,"own_paste":false,"theme":"","date":1509660519}