* 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) | ||||