mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
libavcodec/vp8dec: fix the multi-thread HWAccel decode error
Fix the issue: https://github.com/intel/media-driver/issues/317 the root cause is update_dimensions will be called multple times when decoder thread number is not only 1, but update_dimensions call get_pixel_format in each decode thread will trigger the hwaccel_uninit/hwaccel_init more than once. But only one hwaccel should be shared with all decode threads. in current context, there are 3 situations in the update_dimensions(): 1. First time calling. No matter single thread or multithread, get_pixel_format() should be called after dimensions were set; 2. Dimention changed at the runtime. Dimention need to be updated when macroblocks_base is already allocated, get_pixel_format() should be called to recreate new frames according to updated dimension; 3. Multithread first time calling. After decoder init, the other threads will call update_dimensions() at first time to allocate macroblocks_base and set dimensions. But get_pixel_format() is shouldn't be called due to low level frames and context are already created. In this fix, we only call update_dimensions as need. Signed-off-by: Wang, Shaofei <shaofei.wang@intel.com> Reviewed-by: Jun, Zhao <jun.zhao@intel.com> Reviewed-by: Haihao Xiang <haihao.xiang@intel.com> Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
d8ce8e8ed3
commit
eb6bb8f32f
@ -187,7 +187,7 @@ static av_always_inline
|
|||||||
int update_dimensions(VP8Context *s, int width, int height, int is_vp7)
|
int update_dimensions(VP8Context *s, int width, int height, int is_vp7)
|
||||||
{
|
{
|
||||||
AVCodecContext *avctx = s->avctx;
|
AVCodecContext *avctx = s->avctx;
|
||||||
int i, ret;
|
int i, ret, dim_reset = 0;
|
||||||
|
|
||||||
if (width != s->avctx->width || ((width+15)/16 != s->mb_width || (height+15)/16 != s->mb_height) && s->macroblocks_base ||
|
if (width != s->avctx->width || ((width+15)/16 != s->mb_width || (height+15)/16 != s->mb_height) && s->macroblocks_base ||
|
||||||
height != s->avctx->height) {
|
height != s->avctx->height) {
|
||||||
@ -196,9 +196,12 @@ int update_dimensions(VP8Context *s, int width, int height, int is_vp7)
|
|||||||
ret = ff_set_dimensions(s->avctx, width, height);
|
ret = ff_set_dimensions(s->avctx, width, height);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
dim_reset = (s->macroblocks_base != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s->actually_webp && !is_vp7) {
|
if ((s->pix_fmt == AV_PIX_FMT_NONE || dim_reset) &&
|
||||||
|
!s->actually_webp && !is_vp7) {
|
||||||
s->pix_fmt = get_pixel_format(s);
|
s->pix_fmt = get_pixel_format(s);
|
||||||
if (s->pix_fmt < 0)
|
if (s->pix_fmt < 0)
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
|
Loading…
Reference in New Issue
Block a user