X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Futils.c;h=d473b49da2ca299506d4af6af84808e328e3970a;hb=1fc13a6269516541917b646231b5bc19a42c1384;hp=d3a495ec5f03f96bc91a883699adc61cc3b16340;hpb=8fe1433ad4f866df58c0862f0d13535c96e90d63;p=ffmpeg diff --git a/libavcodec/utils.c b/libavcodec/utils.c index d3a495ec5f0..d473b49da2c 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -512,7 +512,8 @@ static int update_frame_pool(AVCodecContext *avctx, AVFrame *frame) switch (avctx->codec_type) { case AVMEDIA_TYPE_VIDEO: { - AVPicture picture; + uint8_t *data[4]; + int linesize[4]; int size[4] = { 0 }; int w = frame->width; int h = frame->height; @@ -527,27 +528,27 @@ static int update_frame_pool(AVCodecContext *avctx, AVFrame *frame) do { // NOTE: do not align linesizes individually, this breaks e.g. assumptions // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2 - av_image_fill_linesizes(picture.linesize, avctx->pix_fmt, w); + av_image_fill_linesizes(linesize, avctx->pix_fmt, w); // increase alignment of w for next try (rhs gives the lowest bit set in w) w += w & ~(w - 1); unaligned = 0; for (i = 0; i < 4; i++) - unaligned |= picture.linesize[i] % pool->stride_align[i]; + unaligned |= linesize[i] % pool->stride_align[i]; } while (unaligned); - tmpsize = av_image_fill_pointers(picture.data, avctx->pix_fmt, h, - NULL, picture.linesize); + tmpsize = av_image_fill_pointers(data, avctx->pix_fmt, h, + NULL, linesize); if (tmpsize < 0) return -1; - for (i = 0; i < 3 && picture.data[i + 1]; i++) - size[i] = picture.data[i + 1] - picture.data[i]; - size[i] = tmpsize - (picture.data[i] - picture.data[0]); + for (i = 0; i < 3 && data[i + 1]; i++) + size[i] = data[i + 1] - data[i]; + size[i] = tmpsize - (data[i] - data[0]); for (i = 0; i < 4; i++) { av_buffer_pool_uninit(&pool->pools[i]); - pool->linesize[i] = picture.linesize[i]; + pool->linesize[i] = linesize[i]; if (size[i]) { pool->pools[i] = av_buffer_pool_init(size[i] + 16 + STRIDE_ALIGN - 1, CONFIG_MEMORY_POISONING ? @@ -1006,6 +1007,12 @@ static int setup_hwaccel(AVCodecContext *avctx, AVHWAccel *hwa = find_hwaccel(avctx->codec_id, fmt); int ret = 0; + if (avctx->active_thread_type & FF_THREAD_FRAME) { + av_log(avctx, AV_LOG_ERROR, + "Hardware accelerated decoding with frame threading is not supported.\n"); + return AVERROR(EINVAL); + } + if (!hwa) { av_log(avctx, AV_LOG_ERROR, "Could not find an AVHWAccel for the pixel format: %s", @@ -1686,7 +1693,7 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, *got_packet_ptr = 0; if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) { - av_free_packet(avpkt); + av_packet_unref(avpkt); av_init_packet(avpkt); return 0; } @@ -1792,7 +1799,7 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx, } if (ret < 0 || !*got_packet_ptr) { - av_free_packet(avpkt); + av_packet_unref(avpkt); av_init_packet(avpkt); goto end; } @@ -1832,7 +1839,7 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, avctx->stats_out[0] = '\0'; if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) { - av_free_packet(avpkt); + av_packet_unref(avpkt); av_init_packet(avpkt); avpkt->size = 0; return 0; @@ -1886,7 +1893,7 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, } if (ret < 0 || !*got_packet_ptr) - av_free_packet(avpkt); + av_packet_unref(avpkt); emms_c(); return ret; @@ -2346,7 +2353,7 @@ static int recode_subtitle(AVCodecContext *avctx, ret = FFMIN(AVERROR(errno), -1); av_log(avctx, AV_LOG_ERROR, "Unable to recode subtitle event \"%s\" " "from %s to UTF-8\n", inpkt->data, avctx->sub_charenc); - av_free_packet(&tmp); + av_packet_unref(&tmp); goto end; } outpkt->size -= outl; @@ -2453,7 +2460,7 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, pkt_recoded.side_data = NULL; pkt_recoded.side_data_elems = 0; - av_free_packet(&pkt_recoded); + av_packet_unref(&pkt_recoded); } if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) sub->format = 0; @@ -2480,10 +2487,10 @@ void avsubtitle_free(AVSubtitle *sub) int i; for (i = 0; i < sub->num_rects; i++) { - av_freep(&sub->rects[i]->pict.data[0]); - av_freep(&sub->rects[i]->pict.data[1]); - av_freep(&sub->rects[i]->pict.data[2]); - av_freep(&sub->rects[i]->pict.data[3]); + av_freep(&sub->rects[i]->data[0]); + av_freep(&sub->rects[i]->data[1]); + av_freep(&sub->rects[i]->data[2]); + av_freep(&sub->rects[i]->data[3]); av_freep(&sub->rects[i]->text); av_freep(&sub->rects[i]->ass); av_freep(&sub->rects[i]); @@ -2894,6 +2901,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id) case AV_CODEC_ID_ADPCM_IMA_WS: case AV_CODEC_ID_ADPCM_G722: case AV_CODEC_ID_ADPCM_YAMAHA: + case AV_CODEC_ID_ADPCM_AICA: return 4; case AV_CODEC_ID_DSD_LSBF: case AV_CODEC_ID_DSD_MSBF: @@ -2905,6 +2913,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id) case AV_CODEC_ID_PCM_S8_PLANAR: case AV_CODEC_ID_PCM_U8: case AV_CODEC_ID_PCM_ZORK: + case AV_CODEC_ID_SDX2_DPCM: return 8; case AV_CODEC_ID_PCM_S16BE: case AV_CODEC_ID_PCM_S16BE_PLANAR: