The assumption of (MPEG) Picture and H264Picture layout matching might not hold true in the future. Signed-off-by: Hendrik Leppkes <h.leppkes@gmail.com>tags/n2.3
| @@ -30,15 +30,15 @@ | |||
| #include "mpegvideo.h" | |||
| #include "dxva2_internal.h" | |||
| void *ff_dxva2_get_surface(const Picture *picture) | |||
| void *ff_dxva2_get_surface(const AVFrame *frame) | |||
| { | |||
| return picture->f.data[3]; | |||
| return frame->data[3]; | |||
| } | |||
| unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx, | |||
| const Picture *picture) | |||
| const AVFrame *frame) | |||
| { | |||
| void *surface = ff_dxva2_get_surface(picture); | |||
| void *surface = ff_dxva2_get_surface(frame); | |||
| unsigned i; | |||
| for (i = 0; i < ctx->surface_count; i++) | |||
| @@ -91,7 +91,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx, | |||
| return result; | |||
| } | |||
| int ff_dxva2_common_end_frame(AVCodecContext *avctx, Picture *pic, | |||
| int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, | |||
| const void *pp, unsigned pp_size, | |||
| const void *qm, unsigned qm_size, | |||
| int (*commit_bs_si)(AVCodecContext *, | |||
| @@ -107,7 +107,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, Picture *pic, | |||
| do { | |||
| hr = IDirectXVideoDecoder_BeginFrame(ctx->decoder, | |||
| ff_dxva2_get_surface(pic), | |||
| ff_dxva2_get_surface(frame), | |||
| NULL); | |||
| if (hr == E_PENDING) | |||
| av_usleep(2000); | |||
| @@ -51,7 +51,7 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context | |||
| memset(pp, 0, sizeof(*pp)); | |||
| /* Configure current picture */ | |||
| fill_picture_entry(&pp->CurrPic, | |||
| ff_dxva2_get_surface_index(ctx, current_picture), | |||
| ff_dxva2_get_surface_index(ctx, ¤t_picture->f), | |||
| h->picture_structure == PICT_BOTTOM_FIELD); | |||
| /* Configure the set of references */ | |||
| pp->UsedForReferenceFlags = 0; | |||
| @@ -67,7 +67,7 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context | |||
| } | |||
| if (r) { | |||
| fill_picture_entry(&pp->RefFrameList[i], | |||
| ff_dxva2_get_surface_index(ctx, r), | |||
| ff_dxva2_get_surface_index(ctx, &r->f), | |||
| r->long_ref != 0); | |||
| if ((r->reference & PICT_TOP_FIELD) && r->field_poc[0] != INT_MAX) | |||
| @@ -230,7 +230,7 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, | |||
| const H264Picture *r = &h->ref_list[list][i]; | |||
| unsigned plane; | |||
| fill_picture_entry(&slice->RefPicList[list][i], | |||
| ff_dxva2_get_surface_index(ctx, r), | |||
| ff_dxva2_get_surface_index(ctx, &r->f), | |||
| r->reference == PICT_BOTTOM_FIELD); | |||
| for (plane = 0; plane < 3; plane++) { | |||
| int w, o; | |||
| @@ -432,7 +432,7 @@ static int dxva2_h264_end_frame(AVCodecContext *avctx) | |||
| if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0) | |||
| return -1; | |||
| ret = ff_dxva2_common_end_frame(avctx, h->cur_pic_ptr, | |||
| ret = ff_dxva2_common_end_frame(avctx, &h->cur_pic_ptr->f, | |||
| &ctx_pic->pp, sizeof(ctx_pic->pp), | |||
| &ctx_pic->qm, sizeof(ctx_pic->qm), | |||
| commit_bitstream_and_slice_buffer); | |||
| @@ -36,10 +36,10 @@ | |||
| #include "avcodec.h" | |||
| #include "mpegvideo.h" | |||
| void *ff_dxva2_get_surface(const Picture *picture); | |||
| void *ff_dxva2_get_surface(const AVFrame *frame); | |||
| unsigned ff_dxva2_get_surface_index(const struct dxva_context *, | |||
| const Picture *picture); | |||
| const AVFrame *frame); | |||
| int ff_dxva2_commit_buffer(AVCodecContext *, struct dxva_context *, | |||
| DXVA2_DecodeBufferDesc *, | |||
| @@ -47,7 +47,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *, struct dxva_context *, | |||
| unsigned mb_count); | |||
| int ff_dxva2_common_end_frame(AVCodecContext *, Picture *, | |||
| int ff_dxva2_common_end_frame(AVCodecContext *, AVFrame *, | |||
| const void *pp, unsigned pp_size, | |||
| const void *qm, unsigned qm_size, | |||
| int (*commit_bs_si)(AVCodecContext *, | |||
| @@ -44,14 +44,14 @@ static void fill_picture_parameters(AVCodecContext *avctx, | |||
| int is_field = s->picture_structure != PICT_FRAME; | |||
| memset(pp, 0, sizeof(*pp)); | |||
| pp->wDecodedPictureIndex = ff_dxva2_get_surface_index(ctx, current_picture); | |||
| pp->wDecodedPictureIndex = ff_dxva2_get_surface_index(ctx, ¤t_picture->f); | |||
| pp->wDeblockedPictureIndex = 0; | |||
| if (s->pict_type != AV_PICTURE_TYPE_I) | |||
| pp->wForwardRefPictureIndex = ff_dxva2_get_surface_index(ctx, &s->last_picture); | |||
| pp->wForwardRefPictureIndex = ff_dxva2_get_surface_index(ctx, &s->last_picture.f); | |||
| else | |||
| pp->wForwardRefPictureIndex = 0xffff; | |||
| if (s->pict_type == AV_PICTURE_TYPE_B) | |||
| pp->wBackwardRefPictureIndex = ff_dxva2_get_surface_index(ctx, &s->next_picture); | |||
| pp->wBackwardRefPictureIndex = ff_dxva2_get_surface_index(ctx, &s->next_picture.f); | |||
| else | |||
| pp->wBackwardRefPictureIndex = 0xffff; | |||
| pp->wPicWidthInMBminus1 = s->mb_width - 1; | |||
| @@ -259,7 +259,7 @@ static int dxva2_mpeg2_end_frame(AVCodecContext *avctx) | |||
| if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0) | |||
| return -1; | |||
| ret = ff_dxva2_common_end_frame(avctx, s->current_picture_ptr, | |||
| ret = ff_dxva2_common_end_frame(avctx, &s->current_picture_ptr->f, | |||
| &ctx_pic->pp, sizeof(ctx_pic->pp), | |||
| &ctx_pic->qm, sizeof(ctx_pic->qm), | |||
| commit_bitstream_and_slice_buffer); | |||
| @@ -42,13 +42,13 @@ static void fill_picture_parameters(AVCodecContext *avctx, | |||
| memset(pp, 0, sizeof(*pp)); | |||
| pp->wDecodedPictureIndex = | |||
| pp->wDeblockedPictureIndex = ff_dxva2_get_surface_index(ctx, current_picture); | |||
| pp->wDeblockedPictureIndex = ff_dxva2_get_surface_index(ctx, ¤t_picture->f); | |||
| if (s->pict_type != AV_PICTURE_TYPE_I && !v->bi_type) | |||
| pp->wForwardRefPictureIndex = ff_dxva2_get_surface_index(ctx, &s->last_picture); | |||
| pp->wForwardRefPictureIndex = ff_dxva2_get_surface_index(ctx, &s->last_picture.f); | |||
| else | |||
| pp->wForwardRefPictureIndex = 0xffff; | |||
| if (s->pict_type == AV_PICTURE_TYPE_B && !v->bi_type) | |||
| pp->wBackwardRefPictureIndex = ff_dxva2_get_surface_index(ctx, &s->next_picture); | |||
| pp->wBackwardRefPictureIndex = ff_dxva2_get_surface_index(ctx, &s->next_picture.f); | |||
| else | |||
| pp->wBackwardRefPictureIndex = 0xffff; | |||
| if (v->profile == PROFILE_ADVANCED) { | |||
| @@ -261,7 +261,7 @@ static int dxva2_vc1_end_frame(AVCodecContext *avctx) | |||
| if (ctx_pic->bitstream_size <= 0) | |||
| return -1; | |||
| ret = ff_dxva2_common_end_frame(avctx, v->s.current_picture_ptr, | |||
| ret = ff_dxva2_common_end_frame(avctx, &v->s.current_picture_ptr->f, | |||
| &ctx_pic->pp, sizeof(ctx_pic->pp), | |||
| NULL, 0, | |||
| commit_bitstream_and_slice_buffer); | |||