* commit '5c1d7246cd65dc4db1b6dc36e29ce39fc1068f3f': lavc: set AVCodecContext.hwaccel in ff_get_format() Conflicts: libavcodec/mpeg12dec.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.3
@@ -112,7 +112,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) | |||||
return AVERROR(ENOSYS); | return AVERROR(ENOSYS); | ||||
} | } | ||||
s->codec_id = avctx->codec->id; | s->codec_id = avctx->codec->id; | ||||
avctx->hwaccel = ff_find_hwaccel(avctx); | |||||
if (avctx->stream_codec_tag == AV_RL32("l263") && avctx->extradata_size == 56 && avctx->extradata[0] == 1) | if (avctx->stream_codec_tag == AV_RL32("l263") && avctx->extradata_size == 56 && avctx->extradata[0] == 1) | ||||
s->ehc_mode = 1; | s->ehc_mode = 1; | ||||
@@ -1161,8 +1161,6 @@ static int h264_slice_header_init(H264Context *h, int reinit) | |||||
h->sps.num_units_in_tick, den, 1 << 30); | h->sps.num_units_in_tick, den, 1 << 30); | ||||
} | } | ||||
h->avctx->hwaccel = ff_find_hwaccel(h->avctx); | |||||
if (reinit) | if (reinit) | ||||
ff_h264_free_tables(h, 0); | ff_h264_free_tables(h, 0); | ||||
h->first_field = 0; | h->first_field = 0; | ||||
@@ -131,15 +131,6 @@ struct AVCodecDefault { | |||||
extern const uint8_t ff_log2_run[41]; | extern const uint8_t ff_log2_run[41]; | ||||
/** | |||||
* Return the hardware accelerated codec for codec codec_id and | |||||
* pixel format pix_fmt. | |||||
* | |||||
* @param avctx The codec context containing the codec_id and pixel format. | |||||
* @return the hardware accelerated codec, or NULL if none was found. | |||||
*/ | |||||
AVHWAccel *ff_find_hwaccel(AVCodecContext *avctx); | |||||
/** | /** | ||||
* Return the index into tab at which {a,b} match elements {[0],[1]} of tab. | * Return the index into tab at which {a,b} match elements {[0],[1]} of tab. | ||||
* If there is no such matching pair then size is returned. | * If there is no such matching pair then size is returned. | ||||
@@ -1231,7 +1231,6 @@ static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx) | |||||
static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx) | static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx) | ||||
{ | { | ||||
avctx->hwaccel = ff_find_hwaccel(avctx); | |||||
// until then pix_fmt may be changed right after codec init | // until then pix_fmt may be changed right after codec init | ||||
if (avctx->hwaccel || uses_vdpau(avctx)) | if (avctx->hwaccel || uses_vdpau(avctx)) | ||||
if (avctx->idct_algo == FF_IDCT_AUTO) | if (avctx->idct_algo == FF_IDCT_AUTO) | ||||
@@ -1117,9 +1117,41 @@ enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const en | |||||
return fmt[0]; | return fmt[0]; | ||||
} | } | ||||
static AVHWAccel *find_hwaccel(enum AVCodecID codec_id, | |||||
enum AVPixelFormat pix_fmt) | |||||
{ | |||||
AVHWAccel *hwaccel = NULL; | |||||
while ((hwaccel = av_hwaccel_next(hwaccel))) | |||||
if (hwaccel->id == codec_id | |||||
&& hwaccel->pix_fmt == pix_fmt) | |||||
return hwaccel; | |||||
return NULL; | |||||
} | |||||
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt) | int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt) | ||||
{ | { | ||||
return avctx->get_format(avctx, fmt); | |||||
const AVPixFmtDescriptor *desc; | |||||
enum AVPixelFormat ret = avctx->get_format(avctx, fmt); | |||||
desc = av_pix_fmt_desc_get(ret); | |||||
if (!desc) | |||||
return AV_PIX_FMT_NONE; | |||||
if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) { | |||||
avctx->hwaccel = find_hwaccel(avctx->codec_id, ret); | |||||
if (!avctx->hwaccel) { | |||||
av_log(avctx, AV_LOG_ERROR, | |||||
"Could not find an AVHWAccel for the pixel format: %s", | |||||
desc->name); | |||||
return AV_PIX_FMT_NONE; | |||||
} | |||||
} else { | |||||
avctx->hwaccel = NULL; | |||||
} | |||||
return ret; | |||||
} | } | ||||
#if FF_API_AVFRAME_LAVC | #if FF_API_AVFRAME_LAVC | ||||
@@ -3314,20 +3346,6 @@ AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel) | |||||
return hwaccel ? hwaccel->next : first_hwaccel; | return hwaccel ? hwaccel->next : first_hwaccel; | ||||
} | } | ||||
AVHWAccel *ff_find_hwaccel(AVCodecContext *avctx) | |||||
{ | |||||
enum AVCodecID codec_id = avctx->codec->id; | |||||
enum AVPixelFormat pix_fmt = avctx->pix_fmt; | |||||
AVHWAccel *hwaccel = NULL; | |||||
while ((hwaccel = av_hwaccel_next(hwaccel))) | |||||
if (hwaccel->id == codec_id | |||||
&& hwaccel->pix_fmt == pix_fmt) | |||||
return hwaccel; | |||||
return NULL; | |||||
} | |||||
int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)) | int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)) | ||||
{ | { | ||||
if (lockmgr_cb) { | if (lockmgr_cb) { | ||||
@@ -5609,7 +5609,6 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx) | |||||
avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts); | avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts); | ||||
else | else | ||||
avctx->pix_fmt = AV_PIX_FMT_GRAY8; | avctx->pix_fmt = AV_PIX_FMT_GRAY8; | ||||
avctx->hwaccel = ff_find_hwaccel(avctx); | |||||
v->s.avctx = avctx; | v->s.avctx = avctx; | ||||
if ((ret = ff_vc1_init_common(v)) < 0) | if ((ret = ff_vc1_init_common(v)) < 0) | ||||