Browse Source

lavc: set AVCodecContext.hwaccel in ff_get_format()

This way each decoder does not have to do the same thing manually.
tags/n2.3
Anton Khirnov Luca Barbato 12 years ago
parent
commit
5c1d7246cd
6 changed files with 33 additions and 30 deletions
  1. +0
    -1
      libavcodec/h263dec.c
  2. +0
    -2
      libavcodec/h264_slice.c
  3. +0
    -9
      libavcodec/internal.h
  4. +0
    -2
      libavcodec/mpeg12dec.c
  5. +33
    -15
      libavcodec/utils.c
  6. +0
    -1
      libavcodec/vc1dec.c

+ 0
- 1
libavcodec/h263dec.c View File

@@ -108,7 +108,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
return AVERROR(ENOSYS);
}
s->codec_id = avctx->codec->id;
avctx->hwaccel = ff_find_hwaccel(avctx);

/* for h263, we allocate the images after having read the header */
if (avctx->codec->id != AV_CODEC_ID_H263 &&


+ 0
- 2
libavcodec/h264_slice.c View File

@@ -1078,8 +1078,6 @@ static int h264_slice_header_init(H264Context *h, int reinit)
h->sps.num_units_in_tick, den, 1 << 30);
}

h->avctx->hwaccel = ff_find_hwaccel(h->avctx);

if (reinit)
ff_h264_free_tables(h, 0);
h->first_field = 0;


+ 0
- 9
libavcodec/internal.h View File

@@ -102,15 +102,6 @@ struct AVCodecDefault {
const uint8_t *value;
};

/**
* 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.
* If there is no such matching pair then size is returned.


+ 0
- 2
libavcodec/mpeg12dec.c View File

@@ -1295,7 +1295,6 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
} // MPEG-2

avctx->pix_fmt = mpeg_get_pixelformat(avctx);
avctx->hwaccel = ff_find_hwaccel(avctx);
// until then pix_fmt may be changed right after codec init
#if FF_API_XVMC
if ((avctx->pix_fmt == AV_PIX_FMT_XVMC_MPEG2_IDCT ||
@@ -2126,7 +2125,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx)
s->low_delay = 1;

avctx->pix_fmt = mpeg_get_pixelformat(avctx);
avctx->hwaccel = ff_find_hwaccel(avctx);

#if FF_API_XVMC
if ((avctx->pix_fmt == AV_PIX_FMT_XVMC_MPEG2_IDCT || avctx->hwaccel) &&


+ 33
- 15
libavcodec/utils.c View File

@@ -864,9 +864,41 @@ enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const en
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)
{
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
@@ -2207,20 +2239,6 @@ AVHWAccel *av_hwaccel_next(AVHWAccel *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))
{
if (lockmgr_cb) {


+ 0
- 1
libavcodec/vc1dec.c View File

@@ -5598,7 +5598,6 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
else
avctx->pix_fmt = AV_PIX_FMT_GRAY8;
avctx->hwaccel = ff_find_hwaccel(avctx);
v->s.avctx = avctx;

if (ff_vc1_init_common(v) < 0)


Loading…
Cancel
Save