|
|
@ -135,48 +135,6 @@ static av_cold int vdadec_close(AVCodecContext *avctx) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static av_cold int check_format(AVCodecContext *avctx) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
AVCodecParserContext *parser; |
|
|
|
|
|
|
|
uint8_t *pout; |
|
|
|
|
|
|
|
int psize; |
|
|
|
|
|
|
|
int index; |
|
|
|
|
|
|
|
H264Context *h; |
|
|
|
|
|
|
|
int ret = -1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* init parser & parse file */ |
|
|
|
|
|
|
|
parser = av_parser_init(avctx->codec->id); |
|
|
|
|
|
|
|
if (!parser) { |
|
|
|
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Failed to open H.264 parser.\n"); |
|
|
|
|
|
|
|
goto final; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
parser->flags = PARSER_FLAG_COMPLETE_FRAMES; |
|
|
|
|
|
|
|
index = av_parser_parse2(parser, avctx, &pout, &psize, NULL, 0, 0, 0, 0); |
|
|
|
|
|
|
|
if (index < 0) { |
|
|
|
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Failed to parse this file.\n"); |
|
|
|
|
|
|
|
goto release_parser; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* check if support */ |
|
|
|
|
|
|
|
h = parser->priv_data; |
|
|
|
|
|
|
|
switch (h->sps.bit_depth_luma) { |
|
|
|
|
|
|
|
case 8: |
|
|
|
|
|
|
|
if (!CHROMA444(h) && !CHROMA422(h)) { |
|
|
|
|
|
|
|
// only this will H.264 decoder switch to hwaccel
|
|
|
|
|
|
|
|
ret = 0; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Unsupported file.\n"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
release_parser: |
|
|
|
|
|
|
|
av_parser_close(parser); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final: |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static av_cold int vdadec_init(AVCodecContext *avctx) |
|
|
|
static av_cold int vdadec_init(AVCodecContext *avctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|
VDADecoderContext *ctx = avctx->priv_data; |
|
|
|
VDADecoderContext *ctx = avctx->priv_data; |
|
|
@ -194,10 +152,6 @@ static av_cold int vdadec_init(AVCodecContext *avctx) |
|
|
|
ff_h264_vda_decoder.pix_fmts = vda_pixfmts; |
|
|
|
ff_h264_vda_decoder.pix_fmts = vda_pixfmts; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* check if VDA supports this file */ |
|
|
|
|
|
|
|
if (check_format(avctx) < 0) |
|
|
|
|
|
|
|
goto failed; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* init vda */ |
|
|
|
/* init vda */ |
|
|
|
memset(vda_ctx, 0, sizeof(struct vda_context)); |
|
|
|
memset(vda_ctx, 0, sizeof(struct vda_context)); |
|
|
|
vda_ctx->width = avctx->width; |
|
|
|
vda_ctx->width = avctx->width; |
|
|
|