Skip to content

Commit

Permalink
lavc: Split out ff_hwaccel_pixfmt_list_420[] over individual codecs
Browse files Browse the repository at this point in the history
Not all hwaccels implement all codecs, so using one single list for
multiple such codecs means some codecs will be represented in the list,
even though they don't actually handle that codec. Copying specific
lists in each codec fixes that.

Signed-off-by: Martin Storsjö <[email protected]>
  • Loading branch information
rbultje authored and mstorsjo committed Mar 6, 2013
1 parent 5a4e9fe commit 8d06198
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 24 deletions.
2 changes: 2 additions & 0 deletions libavcodec/h263.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ extern uint8_t ff_mba_length[7];

extern uint8_t ff_h263_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];

extern const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[];


int ff_h263_decode_motion(MpegEncContext * s, int pred, int f_code);
av_const int ff_h263_aspect_to_info(AVRational aspect);
Expand Down
13 changes: 12 additions & 1 deletion libavcodec/h263dec.c
Original file line number Diff line number Diff line change
Expand Up @@ -738,6 +738,17 @@ av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time);
return (ret && (avctx->err_recognition & AV_EF_EXPLODE))?ret:get_consumed_bytes(s, buf_size);
}

const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[] = {
#if CONFIG_VAAPI
AV_PIX_FMT_VAAPI_VLD,
#endif
#if CONFIG_VDPAU
AV_PIX_FMT_VDPAU,
#endif
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_NONE
};

AVCodec ff_h263_decoder = {
.name = "h263",
.type = AVMEDIA_TYPE_VIDEO,
Expand All @@ -750,5 +761,5 @@ AVCodec ff_h263_decoder = {
CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
.flush = ff_mpeg_flush,
.long_name = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
.pix_fmts = ff_hwaccel_pixfmt_list_420,
.pix_fmts = ff_h263_hwaccel_pixfmt_list_420,
};
19 changes: 18 additions & 1 deletion libavcodec/h264.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,23 @@ static const uint8_t div6[QP_MAX_NUM + 1] = {
7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
};

static const enum AVPixelFormat h264_hwaccel_pixfmt_list_420[] = {
#if CONFIG_H264_DXVA2_HWACCEL
AV_PIX_FMT_DXVA2_VLD,
#endif
#if CONFIG_H264_VAAPI_HWACCEL
AV_PIX_FMT_VAAPI_VLD,
#endif
#if CONFIG_H264_VDA_HWACCEL
AV_PIX_FMT_VDA_VLD,
#endif
#if CONFIG_H264_VDPAU_HWACCEL
AV_PIX_FMT_VDPAU,
#endif
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_NONE
};

static const enum AVPixelFormat hwaccel_pixfmt_list_h264_jpeg_420[] = {
#if CONFIG_H264_DXVA2_HWACCEL
AV_PIX_FMT_DXVA2_VLD,
Expand Down Expand Up @@ -2823,7 +2840,7 @@ static enum PixelFormat get_pixel_format(H264Context *h)
h->avctx->codec->pix_fmts :
h->avctx->color_range == AVCOL_RANGE_JPEG ?
hwaccel_pixfmt_list_h264_jpeg_420 :
ff_hwaccel_pixfmt_list_420);
h264_hwaccel_pixfmt_list_420);
}
break;
default:
Expand Down
16 changes: 15 additions & 1 deletion libavcodec/mpeg12.c
Original file line number Diff line number Diff line change
Expand Up @@ -1176,6 +1176,20 @@ static const enum AVPixelFormat pixfmt_xvmc_mpg2_420[] = {
AV_PIX_FMT_XVMC_MPEG2_MC,
AV_PIX_FMT_NONE };

static const enum AVPixelFormat mpeg12_hwaccel_pixfmt_list_420[] = {
#if CONFIG_MPEG2_DXVA2_HWACCEL
AV_PIX_FMT_DXVA2_VLD,
#endif
#if CONFIG_MPEG2_VAAPI_HWACCEL
AV_PIX_FMT_VAAPI_VLD,
#endif
#if CONFIG_MPEG1_VDPAU_HWACCEL | CONFIG_MPEG2_VDPAU_HWACCEL
AV_PIX_FMT_VDPAU,
#endif
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_NONE
};

static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
{
Mpeg1Context *s1 = avctx->priv_data;
Expand All @@ -1190,7 +1204,7 @@ static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
return AV_PIX_FMT_VDPAU_MPEG2;
} else {
if (s->chroma_format < 2)
return avctx->get_format(avctx, ff_hwaccel_pixfmt_list_420);
return avctx->get_format(avctx, mpeg12_hwaccel_pixfmt_list_420);
else if (s->chroma_format == 2)
return AV_PIX_FMT_YUV422P;
else
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/mpeg4videodec.c
Original file line number Diff line number Diff line change
Expand Up @@ -2270,7 +2270,7 @@ AVCodec ff_mpeg4_decoder = {
CODEC_CAP_FRAME_THREADS,
.flush = ff_mpeg_flush,
.long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
.pix_fmts = ff_hwaccel_pixfmt_list_420,
.pix_fmts = ff_h263_hwaccel_pixfmt_list_420,
.profiles = NULL_IF_CONFIG_SMALL(mpeg4_video_profiles),
.update_thread_context = ONLY_IF_THREADS_ENABLED(ff_mpeg_update_thread_context),
};
Expand Down
17 changes: 0 additions & 17 deletions libavcodec/mpegvideo.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,23 +130,6 @@ const enum AVPixelFormat ff_pixfmt_list_420[] = {
AV_PIX_FMT_NONE
};

const enum AVPixelFormat ff_hwaccel_pixfmt_list_420[] = {
#if CONFIG_DXVA2
AV_PIX_FMT_DXVA2_VLD,
#endif
#if CONFIG_VAAPI
AV_PIX_FMT_VAAPI_VLD,
#endif
#if CONFIG_VDA
AV_PIX_FMT_VDA_VLD,
#endif
#if CONFIG_VDPAU
AV_PIX_FMT_VDPAU,
#endif
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_NONE
};

static void mpeg_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
int (*mv)[2][4][2],
int mb_x, int mb_y, int mb_intra, int mb_skipped)
Expand Down
1 change: 0 additions & 1 deletion libavcodec/mpegvideo.h
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,6 @@ void ff_MPV_motion(MpegEncContext *s,
int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared);

extern const enum AVPixelFormat ff_pixfmt_list_420[];
extern const enum AVPixelFormat ff_hwaccel_pixfmt_list_420[];

/**
* permute block according to permuatation.
Expand Down
18 changes: 16 additions & 2 deletions libavcodec/vc1dec.c
Original file line number Diff line number Diff line change
Expand Up @@ -5687,6 +5687,20 @@ static const AVProfile profiles[] = {
{ FF_PROFILE_UNKNOWN },
};

static const enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[] = {
#if CONFIG_DXVA2
AV_PIX_FMT_DXVA2_VLD,
#endif
#if CONFIG_VAAPI
AV_PIX_FMT_VAAPI_VLD,
#endif
#if CONFIG_VDPAU
AV_PIX_FMT_VDPAU,
#endif
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_NONE
};

AVCodec ff_vc1_decoder = {
.name = "vc1",
.type = AVMEDIA_TYPE_VIDEO,
Expand All @@ -5698,7 +5712,7 @@ AVCodec ff_vc1_decoder = {
.flush = ff_mpeg_flush,
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
.long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
.pix_fmts = ff_hwaccel_pixfmt_list_420,
.pix_fmts = vc1_hwaccel_pixfmt_list_420,
.profiles = NULL_IF_CONFIG_SMALL(profiles)
};

Expand All @@ -5714,7 +5728,7 @@ AVCodec ff_wmv3_decoder = {
.flush = ff_mpeg_flush,
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
.pix_fmts = ff_hwaccel_pixfmt_list_420,
.pix_fmts = vc1_hwaccel_pixfmt_list_420,
.profiles = NULL_IF_CONFIG_SMALL(profiles)
};
#endif
Expand Down

0 comments on commit 8d06198

Please sign in to comment.