1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * MPEG-2 HW acceleration. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * copyright (c) 2010 Laurent Aimar 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include "config_components.h" 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "libavutil/log.h" 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "dxva2_internal.h" 28cabdff1aSopenharmony_ci#include "mpegutils.h" 29cabdff1aSopenharmony_ci#include "mpegvideodec.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#define MAX_SLICES 1024 32cabdff1aSopenharmony_cistruct dxva2_picture_context { 33cabdff1aSopenharmony_ci DXVA_PictureParameters pp; 34cabdff1aSopenharmony_ci DXVA_QmatrixData qm; 35cabdff1aSopenharmony_ci unsigned slice_count; 36cabdff1aSopenharmony_ci DXVA_SliceInfo slice[MAX_SLICES]; 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci const uint8_t *bitstream; 39cabdff1aSopenharmony_ci unsigned bitstream_size; 40cabdff1aSopenharmony_ci}; 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_cistatic void fill_picture_parameters(AVCodecContext *avctx, 43cabdff1aSopenharmony_ci AVDXVAContext *ctx, 44cabdff1aSopenharmony_ci const struct MpegEncContext *s, 45cabdff1aSopenharmony_ci DXVA_PictureParameters *pp) 46cabdff1aSopenharmony_ci{ 47cabdff1aSopenharmony_ci const Picture *current_picture = s->current_picture_ptr; 48cabdff1aSopenharmony_ci int is_field = s->picture_structure != PICT_FRAME; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci memset(pp, 0, sizeof(*pp)); 51cabdff1aSopenharmony_ci pp->wDecodedPictureIndex = ff_dxva2_get_surface_index(avctx, ctx, current_picture->f); 52cabdff1aSopenharmony_ci pp->wDeblockedPictureIndex = 0; 53cabdff1aSopenharmony_ci if (s->pict_type != AV_PICTURE_TYPE_I) 54cabdff1aSopenharmony_ci pp->wForwardRefPictureIndex = ff_dxva2_get_surface_index(avctx, ctx, s->last_picture.f); 55cabdff1aSopenharmony_ci else 56cabdff1aSopenharmony_ci pp->wForwardRefPictureIndex = 0xffff; 57cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_B) 58cabdff1aSopenharmony_ci pp->wBackwardRefPictureIndex = ff_dxva2_get_surface_index(avctx, ctx, s->next_picture.f); 59cabdff1aSopenharmony_ci else 60cabdff1aSopenharmony_ci pp->wBackwardRefPictureIndex = 0xffff; 61cabdff1aSopenharmony_ci pp->wPicWidthInMBminus1 = s->mb_width - 1; 62cabdff1aSopenharmony_ci pp->wPicHeightInMBminus1 = (s->mb_height >> is_field) - 1; 63cabdff1aSopenharmony_ci pp->bMacroblockWidthMinus1 = 15; 64cabdff1aSopenharmony_ci pp->bMacroblockHeightMinus1 = 15; 65cabdff1aSopenharmony_ci pp->bBlockWidthMinus1 = 7; 66cabdff1aSopenharmony_ci pp->bBlockHeightMinus1 = 7; 67cabdff1aSopenharmony_ci pp->bBPPminus1 = 7; 68cabdff1aSopenharmony_ci pp->bPicStructure = s->picture_structure; 69cabdff1aSopenharmony_ci pp->bSecondField = is_field && !s->first_field; 70cabdff1aSopenharmony_ci pp->bPicIntra = s->pict_type == AV_PICTURE_TYPE_I; 71cabdff1aSopenharmony_ci pp->bPicBackwardPrediction = s->pict_type == AV_PICTURE_TYPE_B; 72cabdff1aSopenharmony_ci pp->bBidirectionalAveragingMode = 0; 73cabdff1aSopenharmony_ci pp->bMVprecisionAndChromaRelation= 0; /* FIXME */ 74cabdff1aSopenharmony_ci pp->bChromaFormat = s->chroma_format; 75cabdff1aSopenharmony_ci pp->bPicScanFixed = 1; 76cabdff1aSopenharmony_ci pp->bPicScanMethod = s->alternate_scan ? 1 : 0; 77cabdff1aSopenharmony_ci pp->bPicReadbackRequests = 0; 78cabdff1aSopenharmony_ci pp->bRcontrol = 0; 79cabdff1aSopenharmony_ci pp->bPicSpatialResid8 = 0; 80cabdff1aSopenharmony_ci pp->bPicOverflowBlocks = 0; 81cabdff1aSopenharmony_ci pp->bPicExtrapolation = 0; 82cabdff1aSopenharmony_ci pp->bPicDeblocked = 0; 83cabdff1aSopenharmony_ci pp->bPicDeblockConfined = 0; 84cabdff1aSopenharmony_ci pp->bPic4MVallowed = 0; 85cabdff1aSopenharmony_ci pp->bPicOBMC = 0; 86cabdff1aSopenharmony_ci pp->bPicBinPB = 0; 87cabdff1aSopenharmony_ci pp->bMV_RPS = 0; 88cabdff1aSopenharmony_ci pp->bReservedBits = 0; 89cabdff1aSopenharmony_ci pp->wBitstreamFcodes = (s->mpeg_f_code[0][0] << 12) | 90cabdff1aSopenharmony_ci (s->mpeg_f_code[0][1] << 8) | 91cabdff1aSopenharmony_ci (s->mpeg_f_code[1][0] << 4) | 92cabdff1aSopenharmony_ci (s->mpeg_f_code[1][1] ); 93cabdff1aSopenharmony_ci pp->wBitstreamPCEelements = (s->intra_dc_precision << 14) | 94cabdff1aSopenharmony_ci (s->picture_structure << 12) | 95cabdff1aSopenharmony_ci (s->top_field_first << 11) | 96cabdff1aSopenharmony_ci (s->frame_pred_frame_dct << 10) | 97cabdff1aSopenharmony_ci (s->concealment_motion_vectors << 9) | 98cabdff1aSopenharmony_ci (s->q_scale_type << 8) | 99cabdff1aSopenharmony_ci (s->intra_vlc_format << 7) | 100cabdff1aSopenharmony_ci (s->alternate_scan << 6) | 101cabdff1aSopenharmony_ci (s->repeat_first_field << 5) | 102cabdff1aSopenharmony_ci (s->chroma_420_type << 4) | 103cabdff1aSopenharmony_ci (s->progressive_frame << 3); 104cabdff1aSopenharmony_ci pp->bBitstreamConcealmentNeed = 0; 105cabdff1aSopenharmony_ci pp->bBitstreamConcealmentMethod = 0; 106cabdff1aSopenharmony_ci} 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_cistatic void fill_quantization_matrices(AVCodecContext *avctx, 109cabdff1aSopenharmony_ci AVDXVAContext *ctx, 110cabdff1aSopenharmony_ci const struct MpegEncContext *s, 111cabdff1aSopenharmony_ci DXVA_QmatrixData *qm) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci int i; 114cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) 115cabdff1aSopenharmony_ci qm->bNewQmatrix[i] = 1; 116cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) { 117cabdff1aSopenharmony_ci int n = s->idsp.idct_permutation[ff_zigzag_direct[i]]; 118cabdff1aSopenharmony_ci qm->Qmatrix[0][i] = s->intra_matrix[n]; 119cabdff1aSopenharmony_ci qm->Qmatrix[1][i] = s->inter_matrix[n]; 120cabdff1aSopenharmony_ci qm->Qmatrix[2][i] = s->chroma_intra_matrix[n]; 121cabdff1aSopenharmony_ci qm->Qmatrix[3][i] = s->chroma_inter_matrix[n]; 122cabdff1aSopenharmony_ci } 123cabdff1aSopenharmony_ci} 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_cistatic void fill_slice(AVCodecContext *avctx, 126cabdff1aSopenharmony_ci const struct MpegEncContext *s, 127cabdff1aSopenharmony_ci DXVA_SliceInfo *slice, 128cabdff1aSopenharmony_ci unsigned position, 129cabdff1aSopenharmony_ci const uint8_t *buffer, unsigned size) 130cabdff1aSopenharmony_ci{ 131cabdff1aSopenharmony_ci int is_field = s->picture_structure != PICT_FRAME; 132cabdff1aSopenharmony_ci GetBitContext gb; 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci memset(slice, 0, sizeof(*slice)); 135cabdff1aSopenharmony_ci slice->wHorizontalPosition = s->mb_x; 136cabdff1aSopenharmony_ci slice->wVerticalPosition = s->mb_y >> is_field; 137cabdff1aSopenharmony_ci slice->dwSliceBitsInBuffer = 8 * size; 138cabdff1aSopenharmony_ci slice->dwSliceDataLocation = position; 139cabdff1aSopenharmony_ci slice->bStartCodeBitOffset = 0; 140cabdff1aSopenharmony_ci slice->bReservedBits = 0; 141cabdff1aSopenharmony_ci /* XXX We store the index of the first MB and it will be fixed later */ 142cabdff1aSopenharmony_ci slice->wNumberMBsInSlice = (s->mb_y >> is_field) * s->mb_width + s->mb_x; 143cabdff1aSopenharmony_ci slice->wBadSliceChopping = 0; 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci init_get_bits(&gb, &buffer[4], 8 * (size - 4)); 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci slice->wQuantizerScaleCode = get_bits(&gb, 5); 148cabdff1aSopenharmony_ci skip_1stop_8data_bits(&gb); 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci slice->wMBbitOffset = 4 * 8 + get_bits_count(&gb); 151cabdff1aSopenharmony_ci} 152cabdff1aSopenharmony_cistatic int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, 153cabdff1aSopenharmony_ci DECODER_BUFFER_DESC *bs, 154cabdff1aSopenharmony_ci DECODER_BUFFER_DESC *sc) 155cabdff1aSopenharmony_ci{ 156cabdff1aSopenharmony_ci const struct MpegEncContext *s = avctx->priv_data; 157cabdff1aSopenharmony_ci AVDXVAContext *ctx = DXVA_CONTEXT(avctx); 158cabdff1aSopenharmony_ci struct dxva2_picture_context *ctx_pic = 159cabdff1aSopenharmony_ci s->current_picture_ptr->hwaccel_picture_private; 160cabdff1aSopenharmony_ci const int is_field = s->picture_structure != PICT_FRAME; 161cabdff1aSopenharmony_ci const unsigned mb_count = s->mb_width * (s->mb_height >> is_field); 162cabdff1aSopenharmony_ci void *dxva_data_ptr; 163cabdff1aSopenharmony_ci uint8_t *dxva_data, *current, *end; 164cabdff1aSopenharmony_ci unsigned dxva_size; 165cabdff1aSopenharmony_ci unsigned i; 166cabdff1aSopenharmony_ci unsigned type; 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_ci#if CONFIG_D3D11VA 169cabdff1aSopenharmony_ci if (ff_dxva2_is_d3d11(avctx)) { 170cabdff1aSopenharmony_ci type = D3D11_VIDEO_DECODER_BUFFER_BITSTREAM; 171cabdff1aSopenharmony_ci if (FAILED(ID3D11VideoContext_GetDecoderBuffer(D3D11VA_CONTEXT(ctx)->video_context, 172cabdff1aSopenharmony_ci D3D11VA_CONTEXT(ctx)->decoder, 173cabdff1aSopenharmony_ci type, 174cabdff1aSopenharmony_ci &dxva_size, &dxva_data_ptr))) 175cabdff1aSopenharmony_ci return -1; 176cabdff1aSopenharmony_ci } 177cabdff1aSopenharmony_ci#endif 178cabdff1aSopenharmony_ci#if CONFIG_DXVA2 179cabdff1aSopenharmony_ci if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) { 180cabdff1aSopenharmony_ci type = DXVA2_BitStreamDateBufferType; 181cabdff1aSopenharmony_ci if (FAILED(IDirectXVideoDecoder_GetBuffer(DXVA2_CONTEXT(ctx)->decoder, 182cabdff1aSopenharmony_ci type, 183cabdff1aSopenharmony_ci &dxva_data_ptr, &dxva_size))) 184cabdff1aSopenharmony_ci return -1; 185cabdff1aSopenharmony_ci } 186cabdff1aSopenharmony_ci#endif 187cabdff1aSopenharmony_ci 188cabdff1aSopenharmony_ci dxva_data = dxva_data_ptr; 189cabdff1aSopenharmony_ci current = dxva_data; 190cabdff1aSopenharmony_ci end = dxva_data + dxva_size; 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci for (i = 0; i < ctx_pic->slice_count; i++) { 193cabdff1aSopenharmony_ci DXVA_SliceInfo *slice = &ctx_pic->slice[i]; 194cabdff1aSopenharmony_ci unsigned position = slice->dwSliceDataLocation; 195cabdff1aSopenharmony_ci unsigned size = slice->dwSliceBitsInBuffer / 8; 196cabdff1aSopenharmony_ci if (size > end - current) { 197cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Failed to build bitstream"); 198cabdff1aSopenharmony_ci break; 199cabdff1aSopenharmony_ci } 200cabdff1aSopenharmony_ci slice->dwSliceDataLocation = current - dxva_data; 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_ci if (i < ctx_pic->slice_count - 1) 203cabdff1aSopenharmony_ci slice->wNumberMBsInSlice = 204cabdff1aSopenharmony_ci slice[1].wNumberMBsInSlice - slice[0].wNumberMBsInSlice; 205cabdff1aSopenharmony_ci else 206cabdff1aSopenharmony_ci slice->wNumberMBsInSlice = 207cabdff1aSopenharmony_ci mb_count - slice[0].wNumberMBsInSlice; 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci memcpy(current, &ctx_pic->bitstream[position], size); 210cabdff1aSopenharmony_ci current += size; 211cabdff1aSopenharmony_ci } 212cabdff1aSopenharmony_ci#if CONFIG_D3D11VA 213cabdff1aSopenharmony_ci if (ff_dxva2_is_d3d11(avctx)) 214cabdff1aSopenharmony_ci if (FAILED(ID3D11VideoContext_ReleaseDecoderBuffer(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder, type))) 215cabdff1aSopenharmony_ci return -1; 216cabdff1aSopenharmony_ci#endif 217cabdff1aSopenharmony_ci#if CONFIG_DXVA2 218cabdff1aSopenharmony_ci if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) 219cabdff1aSopenharmony_ci if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(DXVA2_CONTEXT(ctx)->decoder, type))) 220cabdff1aSopenharmony_ci return -1; 221cabdff1aSopenharmony_ci#endif 222cabdff1aSopenharmony_ci if (i < ctx_pic->slice_count) 223cabdff1aSopenharmony_ci return -1; 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_ci#if CONFIG_D3D11VA 226cabdff1aSopenharmony_ci if (ff_dxva2_is_d3d11(avctx)) { 227cabdff1aSopenharmony_ci D3D11_VIDEO_DECODER_BUFFER_DESC *dsc11 = bs; 228cabdff1aSopenharmony_ci memset(dsc11, 0, sizeof(*dsc11)); 229cabdff1aSopenharmony_ci dsc11->BufferType = type; 230cabdff1aSopenharmony_ci dsc11->DataSize = current - dxva_data; 231cabdff1aSopenharmony_ci dsc11->NumMBsInBuffer = mb_count; 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_ci type = D3D11_VIDEO_DECODER_BUFFER_SLICE_CONTROL; 234cabdff1aSopenharmony_ci } 235cabdff1aSopenharmony_ci#endif 236cabdff1aSopenharmony_ci#if CONFIG_DXVA2 237cabdff1aSopenharmony_ci if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) { 238cabdff1aSopenharmony_ci DXVA2_DecodeBufferDesc *dsc2 = bs; 239cabdff1aSopenharmony_ci memset(dsc2, 0, sizeof(*dsc2)); 240cabdff1aSopenharmony_ci dsc2->CompressedBufferType = type; 241cabdff1aSopenharmony_ci dsc2->DataSize = current - dxva_data; 242cabdff1aSopenharmony_ci dsc2->NumMBsInBuffer = mb_count; 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci type = DXVA2_SliceControlBufferType; 245cabdff1aSopenharmony_ci } 246cabdff1aSopenharmony_ci#endif 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci return ff_dxva2_commit_buffer(avctx, ctx, sc, 249cabdff1aSopenharmony_ci type, 250cabdff1aSopenharmony_ci ctx_pic->slice, 251cabdff1aSopenharmony_ci ctx_pic->slice_count * sizeof(*ctx_pic->slice), 252cabdff1aSopenharmony_ci mb_count); 253cabdff1aSopenharmony_ci} 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_cistatic int dxva2_mpeg2_start_frame(AVCodecContext *avctx, 256cabdff1aSopenharmony_ci av_unused const uint8_t *buffer, 257cabdff1aSopenharmony_ci av_unused uint32_t size) 258cabdff1aSopenharmony_ci{ 259cabdff1aSopenharmony_ci const struct MpegEncContext *s = avctx->priv_data; 260cabdff1aSopenharmony_ci AVDXVAContext *ctx = DXVA_CONTEXT(avctx); 261cabdff1aSopenharmony_ci struct dxva2_picture_context *ctx_pic = 262cabdff1aSopenharmony_ci s->current_picture_ptr->hwaccel_picture_private; 263cabdff1aSopenharmony_ci 264cabdff1aSopenharmony_ci if (!DXVA_CONTEXT_VALID(avctx, ctx)) 265cabdff1aSopenharmony_ci return -1; 266cabdff1aSopenharmony_ci assert(ctx_pic); 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ci fill_picture_parameters(avctx, ctx, s, &ctx_pic->pp); 269cabdff1aSopenharmony_ci fill_quantization_matrices(avctx, ctx, s, &ctx_pic->qm); 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci ctx_pic->slice_count = 0; 272cabdff1aSopenharmony_ci ctx_pic->bitstream_size = 0; 273cabdff1aSopenharmony_ci ctx_pic->bitstream = NULL; 274cabdff1aSopenharmony_ci return 0; 275cabdff1aSopenharmony_ci} 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_cistatic int dxva2_mpeg2_decode_slice(AVCodecContext *avctx, 278cabdff1aSopenharmony_ci const uint8_t *buffer, uint32_t size) 279cabdff1aSopenharmony_ci{ 280cabdff1aSopenharmony_ci const struct MpegEncContext *s = avctx->priv_data; 281cabdff1aSopenharmony_ci struct dxva2_picture_context *ctx_pic = 282cabdff1aSopenharmony_ci s->current_picture_ptr->hwaccel_picture_private; 283cabdff1aSopenharmony_ci unsigned position; 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci if (ctx_pic->slice_count >= MAX_SLICES) { 286cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "%d slices in dxva2", 287cabdff1aSopenharmony_ci ctx_pic->slice_count); 288cabdff1aSopenharmony_ci return -1; 289cabdff1aSopenharmony_ci } 290cabdff1aSopenharmony_ci if (!ctx_pic->bitstream) 291cabdff1aSopenharmony_ci ctx_pic->bitstream = buffer; 292cabdff1aSopenharmony_ci ctx_pic->bitstream_size += size; 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci position = buffer - ctx_pic->bitstream; 295cabdff1aSopenharmony_ci fill_slice(avctx, s, &ctx_pic->slice[ctx_pic->slice_count++], position, 296cabdff1aSopenharmony_ci buffer, size); 297cabdff1aSopenharmony_ci return 0; 298cabdff1aSopenharmony_ci} 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_cistatic int dxva2_mpeg2_end_frame(AVCodecContext *avctx) 301cabdff1aSopenharmony_ci{ 302cabdff1aSopenharmony_ci struct MpegEncContext *s = avctx->priv_data; 303cabdff1aSopenharmony_ci struct dxva2_picture_context *ctx_pic = 304cabdff1aSopenharmony_ci s->current_picture_ptr->hwaccel_picture_private; 305cabdff1aSopenharmony_ci int ret; 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0) 308cabdff1aSopenharmony_ci return -1; 309cabdff1aSopenharmony_ci ret = ff_dxva2_common_end_frame(avctx, s->current_picture_ptr->f, 310cabdff1aSopenharmony_ci &ctx_pic->pp, sizeof(ctx_pic->pp), 311cabdff1aSopenharmony_ci &ctx_pic->qm, sizeof(ctx_pic->qm), 312cabdff1aSopenharmony_ci commit_bitstream_and_slice_buffer); 313cabdff1aSopenharmony_ci if (!ret) 314cabdff1aSopenharmony_ci ff_mpeg_draw_horiz_band(s, 0, avctx->height); 315cabdff1aSopenharmony_ci return ret; 316cabdff1aSopenharmony_ci} 317cabdff1aSopenharmony_ci 318cabdff1aSopenharmony_ci#if CONFIG_MPEG2_DXVA2_HWACCEL 319cabdff1aSopenharmony_ciconst AVHWAccel ff_mpeg2_dxva2_hwaccel = { 320cabdff1aSopenharmony_ci .name = "mpeg2_dxva2", 321cabdff1aSopenharmony_ci .type = AVMEDIA_TYPE_VIDEO, 322cabdff1aSopenharmony_ci .id = AV_CODEC_ID_MPEG2VIDEO, 323cabdff1aSopenharmony_ci .pix_fmt = AV_PIX_FMT_DXVA2_VLD, 324cabdff1aSopenharmony_ci .init = ff_dxva2_decode_init, 325cabdff1aSopenharmony_ci .uninit = ff_dxva2_decode_uninit, 326cabdff1aSopenharmony_ci .start_frame = dxva2_mpeg2_start_frame, 327cabdff1aSopenharmony_ci .decode_slice = dxva2_mpeg2_decode_slice, 328cabdff1aSopenharmony_ci .end_frame = dxva2_mpeg2_end_frame, 329cabdff1aSopenharmony_ci .frame_params = ff_dxva2_common_frame_params, 330cabdff1aSopenharmony_ci .frame_priv_data_size = sizeof(struct dxva2_picture_context), 331cabdff1aSopenharmony_ci .priv_data_size = sizeof(FFDXVASharedContext), 332cabdff1aSopenharmony_ci}; 333cabdff1aSopenharmony_ci#endif 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci#if CONFIG_MPEG2_D3D11VA_HWACCEL 336cabdff1aSopenharmony_ciconst AVHWAccel ff_mpeg2_d3d11va_hwaccel = { 337cabdff1aSopenharmony_ci .name = "mpeg2_d3d11va", 338cabdff1aSopenharmony_ci .type = AVMEDIA_TYPE_VIDEO, 339cabdff1aSopenharmony_ci .id = AV_CODEC_ID_MPEG2VIDEO, 340cabdff1aSopenharmony_ci .pix_fmt = AV_PIX_FMT_D3D11VA_VLD, 341cabdff1aSopenharmony_ci .init = ff_dxva2_decode_init, 342cabdff1aSopenharmony_ci .uninit = ff_dxva2_decode_uninit, 343cabdff1aSopenharmony_ci .start_frame = dxva2_mpeg2_start_frame, 344cabdff1aSopenharmony_ci .decode_slice = dxva2_mpeg2_decode_slice, 345cabdff1aSopenharmony_ci .end_frame = dxva2_mpeg2_end_frame, 346cabdff1aSopenharmony_ci .frame_params = ff_dxva2_common_frame_params, 347cabdff1aSopenharmony_ci .frame_priv_data_size = sizeof(struct dxva2_picture_context), 348cabdff1aSopenharmony_ci .priv_data_size = sizeof(FFDXVASharedContext), 349cabdff1aSopenharmony_ci}; 350cabdff1aSopenharmony_ci#endif 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ci#if CONFIG_MPEG2_D3D11VA2_HWACCEL 353cabdff1aSopenharmony_ciconst AVHWAccel ff_mpeg2_d3d11va2_hwaccel = { 354cabdff1aSopenharmony_ci .name = "mpeg2_d3d11va2", 355cabdff1aSopenharmony_ci .type = AVMEDIA_TYPE_VIDEO, 356cabdff1aSopenharmony_ci .id = AV_CODEC_ID_MPEG2VIDEO, 357cabdff1aSopenharmony_ci .pix_fmt = AV_PIX_FMT_D3D11, 358cabdff1aSopenharmony_ci .init = ff_dxva2_decode_init, 359cabdff1aSopenharmony_ci .uninit = ff_dxva2_decode_uninit, 360cabdff1aSopenharmony_ci .start_frame = dxva2_mpeg2_start_frame, 361cabdff1aSopenharmony_ci .decode_slice = dxva2_mpeg2_decode_slice, 362cabdff1aSopenharmony_ci .end_frame = dxva2_mpeg2_end_frame, 363cabdff1aSopenharmony_ci .frame_params = ff_dxva2_common_frame_params, 364cabdff1aSopenharmony_ci .frame_priv_data_size = sizeof(struct dxva2_picture_context), 365cabdff1aSopenharmony_ci .priv_data_size = sizeof(FFDXVASharedContext), 366cabdff1aSopenharmony_ci}; 367cabdff1aSopenharmony_ci#endif 368