It represents the relationship between them more naturally and will be
useful in the following commits.
---
 libavcodec/h264_ps.c    | 29 +++++++++++++++++++++++++----
 libavcodec/h264_ps.h    |  2 ++
 libavcodec/h264_slice.c |  4 ++--
 3 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c
index b3a0e8a..ba6e371 100644
--- a/libavcodec/h264_ps.c
+++ b/libavcodec/h264_ps.c
@@ -663,6 +663,15 @@ static void build_qp_table(PPS *pps, int t, int index, 
const int depth)
             ff_h264_chroma_qp[depth - 8][av_clip(i + index, 0, max_qp)];
 }
 
+static void pps_free(void *opaque, uint8_t *data)
+{
+    PPS *pps = (PPS*)data;
+
+    av_buffer_unref(&pps->sps_buf);
+
+    av_freep(&data);
+}
+
 int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext 
*avctx,
                                          H264ParamSets *ps, int bit_length)
 {
@@ -679,10 +688,16 @@ int ff_h264_decode_picture_parameter_set(GetBitContext 
*gb, AVCodecContext *avct
         return AVERROR_INVALIDDATA;
     }
 
-    pps_buf = av_buffer_allocz(sizeof(*pps));
-    if (!pps_buf)
+    pps = av_mallocz(sizeof(*pps));
+    if (!pps)
         return AVERROR(ENOMEM);
-    pps = (PPS*)pps_buf->data;
+
+    pps_buf = av_buffer_create((uint8_t*)pps, sizeof(*pps),
+                               pps_free, NULL, 0);
+    if (!pps_buf) {
+        av_freep(&pps);
+        return AVERROR(ENOMEM);
+    }
 
     pps->sps_id = get_ue_golomb_31(gb);
     if ((unsigned)pps->sps_id >= MAX_SPS_COUNT ||
@@ -691,7 +706,13 @@ int ff_h264_decode_picture_parameter_set(GetBitContext 
*gb, AVCodecContext *avct
         ret = AVERROR_INVALIDDATA;
         goto fail;
     }
-    sps = (SPS*)ps->sps_list[pps->sps_id]->data;
+
+    pps->sps_buf = av_buffer_ref(ps->sps_list[pps->sps_id]);
+    if (!pps->sps_buf) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
+    sps = (SPS*)pps->sps_buf->data;
 
     if (sps->bit_depth_luma > 10) {
         avpriv_report_missing_feature(avctx, "Luma bit depth=%d (max=10)",
diff --git a/libavcodec/h264_ps.h b/libavcodec/h264_ps.h
index 9a32d93..c0ff98c 100644
--- a/libavcodec/h264_ps.h
+++ b/libavcodec/h264_ps.h
@@ -128,6 +128,8 @@ typedef struct PPS {
     uint32_t dequant8_buffer[6][QP_MAX_NUM + 1][64];
     uint32_t(*dequant4_coeff[6])[16];
     uint32_t(*dequant8_coeff[6])[64];
+
+    AVBufferRef *sps_buf;
 } PPS;
 
 typedef struct H264ParamSets {
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 19f5d37..705baa0 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -916,8 +916,8 @@ static int h264_init_ps(H264Context *h, const 
H264SliceContext *sl)
     int needs_reinit = 0, ret;
 
     h->ps.pps = (const PPS*)h->ps.pps_list[sl->pps_id]->data;
-    if (h->ps.sps != (const SPS*)h->ps.sps_list[h->ps.pps->sps_id]->data) {
-        h->ps.sps = (SPS*)h->ps.sps_list[h->ps.pps->sps_id]->data;
+    if (h->ps.sps != (const SPS*)h->ps.pps->sps_buf->data) {
+        h->ps.sps = (SPS*)h->ps.pps->sps_buf->data;
 
         if (h->bit_depth_luma    != h->ps.sps->bit_depth_luma ||
             h->chroma_format_idc != h->ps.sps->chroma_format_idc)
-- 
2.0.0

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to