]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/dxva2_h264.c
Bump version and update APIchanges after r25210.
[ffmpeg] / libavcodec / dxva2_h264.c
index d507becc41f16bdad298a7510832f0030a204698..332a76302be4b7e0c72797471c39b5ddab194a21 100644 (file)
@@ -46,7 +46,7 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context
 {
     const MpegEncContext *s = &h->s;
     const Picture *current_picture = s->current_picture_ptr;
-    int i;
+    int i, j;
 
     memset(pp, 0, sizeof(*pp));
     /* Configure current picture */
@@ -56,16 +56,16 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context
     /* Configure the set of references */
     pp->UsedForReferenceFlags  = 0;
     pp->NonExistingFrameFlags  = 0;
-    for (i = 0; i < FF_ARRAY_ELEMS(pp->RefFrameList); i++) {
-        if (i < h->short_ref_count + h->long_ref_count) {
-            const Picture *r;
-            if (i < h->short_ref_count) {
-                r = h->short_ref[i];
-                assert(!r->long_ref);
-            } else {
-                r = h->long_ref[i - h->short_ref_count];
-                assert(r->long_ref);
-            }
+    for (i = 0, j = 0; i < FF_ARRAY_ELEMS(pp->RefFrameList); i++) {
+        const Picture *r;
+        if (j < h->short_ref_count) {
+            r = h->short_ref[j++];
+        } else {
+            r = NULL;
+            while (!r && j < h->short_ref_count + 16)
+                r = h->long_ref[j++ - h->short_ref_count];
+        }
+        if (r) {
             fill_picture_entry(&pp->RefFrameList[i],
                                ff_dxva2_get_surface_index(ctx, r),
                                r->long_ref != 0);
@@ -182,9 +182,9 @@ static void fill_slice_short(DXVA_Slice_H264_Short *slice,
 static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
                             unsigned position, unsigned size)
 {
-    H264Context *h = avctx->priv_data; /* FIXME Can't use const because of get_bits_count */
+    const H264Context *h = avctx->priv_data;
     struct dxva_context *ctx = avctx->hwaccel_context;
-    MpegEncContext *s = &h->s;
+    const MpegEncContext *s = &h->s;
     unsigned list;
 
     memset(slice, 0, sizeof(*slice));
@@ -220,11 +220,11 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
                 for (plane = 0; plane < 3; plane++) {
                     int w, o;
                     if (plane == 0 && h->luma_weight_flag[list]) {
-                        w = h->luma_weight[list][i];
-                        o = h->luma_offset[list][i];
+                        w = h->luma_weight[i][list][0];
+                        o = h->luma_weight[i][list][1];
                     } else if (plane >= 1 && h->chroma_weight_flag[list]) {
-                        w = h->chroma_weight[list][i][plane-1];
-                        o = h->chroma_offset[list][i][plane-1];
+                        w = h->chroma_weight[i][list][plane-1][0];
+                        o = h->chroma_weight[i][list][plane-1][1];
                     } else {
                         w = 1 << (plane == 0 ? h->luma_log2_weight_denom :
                                                h->chroma_log2_weight_denom);
@@ -260,8 +260,8 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
                                              DXVA2_DecodeBufferDesc *bs,
                                              DXVA2_DecodeBufferDesc *sc)
 {
-    H264Context *h = avctx->priv_data;
-    MpegEncContext *s = &h->s;
+    const H264Context *h = avctx->priv_data;
+    const MpegEncContext *s = &h->s;
     const unsigned mb_count = s->mb_width * s->mb_height;
     struct dxva_context *ctx = avctx->hwaccel_context;
     const Picture *current_picture = h->s.current_picture_ptr;
@@ -381,7 +381,7 @@ static int start_frame(AVCodecContext *avctx,
 static int decode_slice(AVCodecContext *avctx,
                         const uint8_t *buffer, uint32_t size)
 {
-    H264Context *h = avctx->priv_data; /* FIXME Can't use const because of get_bits_count */
+    const H264Context *h = avctx->priv_data;
     struct dxva_context *ctx = avctx->hwaccel_context;
     const Picture *current_picture = h->s.current_picture_ptr;
     struct dxva2_picture_context *ctx_pic = current_picture->hwaccel_picture_private;
@@ -425,7 +425,7 @@ static int end_frame(AVCodecContext *avctx)
 
 AVHWAccel h264_dxva2_hwaccel = {
     .name           = "h264_dxva2",
-    .type           = CODEC_TYPE_VIDEO,
+    .type           = AVMEDIA_TYPE_VIDEO,
     .id             = CODEC_ID_H264,
     .pix_fmt        = PIX_FMT_DXVA2_VLD,
     .capabilities   = 0,