mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
audio frame multi-threaded decoding
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
258a05b216
commit
d5f7f1fef1
@ -227,7 +227,7 @@ static const AVOption options[]={
|
||||
{"vis_qp", "visualize quantization parameter (QP), lower QP are tinted greener", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_QP }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||
{"vis_mb_type", "visualize block types", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MB_TYPE }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||
{"buffers", "picture buffer allocations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUFFERS }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||
{"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||
{"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|A|D, "debug"},
|
||||
{"vismv", "visualize motion vectors (MVs)", OFFSET(debug_mv), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|D, "debug_mv"},
|
||||
{"pf", "forward predicted MVs of P-frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MV_P_FOR }, INT_MIN, INT_MAX, V|D, "debug_mv"},
|
||||
{"bf", "forward predicted MVs of B-frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MV_B_FOR }, INT_MIN, INT_MAX, V|D, "debug_mv"},
|
||||
@ -285,7 +285,7 @@ static const AVOption options[]={
|
||||
{"rc_init_occupancy", "number of bits which should be loaded into the rc buffer before decoding starts", OFFSET(rc_initial_buffer_occupancy), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
{"flags2", NULL, OFFSET(flags2), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, V|A|E|D, "flags2"},
|
||||
{"error", NULL, OFFSET(error_rate), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.i64 = 1 }, 0, INT_MAX, V|E|D, "threads"},
|
||||
{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.i64 = 1 }, 0, INT_MAX, V|A|E|D, "threads"},
|
||||
{"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, INT_MIN, INT_MAX, V|E|D, "threads"},
|
||||
{"me_threshold", "motion estimation threshold", OFFSET(me_threshold), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
{"mb_threshold", "macroblock threshold", OFFSET(mb_threshold), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
@ -357,7 +357,7 @@ static const AVOption options[]={
|
||||
{"chroma_sample_location", NULL, OFFSET(chroma_sample_location), AV_OPT_TYPE_INT, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, 0, AVCHROMA_LOC_NB-1, V|E|D},
|
||||
{"log_level_offset", "set the log level offset", OFFSET(log_level_offset), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX },
|
||||
{"slices", "number of slices, used in parallelized encoding", OFFSET(slices), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, V|E},
|
||||
{"thread_type", "select multithreading type", OFFSET(thread_type), AV_OPT_TYPE_FLAGS, {.i64 = FF_THREAD_SLICE|FF_THREAD_FRAME }, 0, INT_MAX, V|E|D, "thread_type"},
|
||||
{"thread_type", "select multithreading type", OFFSET(thread_type), AV_OPT_TYPE_FLAGS, {.i64 = FF_THREAD_SLICE|FF_THREAD_FRAME }, 0, INT_MAX, V|A|E|D, "thread_type"},
|
||||
{"slice", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_THREAD_SLICE }, INT_MIN, INT_MAX, V|E|D, "thread_type"},
|
||||
{"frame", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_THREAD_FRAME }, INT_MIN, INT_MAX, V|E|D, "thread_type"},
|
||||
{"audio_service_type", "audio service type", OFFSET(audio_service_type), AV_OPT_TYPE_INT, {.i64 = AV_AUDIO_SERVICE_TYPE_MAIN }, 0, AV_AUDIO_SERVICE_TYPE_NB-1, A|E, "audio_service_type"},
|
||||
|
@ -403,6 +403,11 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src,
|
||||
|
||||
dst->hwaccel = src->hwaccel;
|
||||
dst->hwaccel_context = src->hwaccel_context;
|
||||
|
||||
dst->channels = src->channels;
|
||||
dst->sample_rate = src->sample_rate;
|
||||
dst->sample_fmt = src->sample_fmt;
|
||||
dst->channel_layout = src->channel_layout;
|
||||
}
|
||||
|
||||
if (for_user) {
|
||||
@ -477,7 +482,8 @@ static void release_delayed_buffers(PerThreadContext *p)
|
||||
pthread_mutex_lock(&fctx->buffer_mutex);
|
||||
|
||||
// fix extended data in case the caller screwed it up
|
||||
av_assert0(p->avctx->codec_type == AVMEDIA_TYPE_VIDEO);
|
||||
av_assert0(p->avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
|
||||
p->avctx->codec_type == AVMEDIA_TYPE_AUDIO);
|
||||
f = &p->released_buffers[--p->num_released_buffers];
|
||||
f->extended_data = f->data;
|
||||
av_frame_unref(f);
|
||||
|
@ -2075,7 +2075,7 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
|
||||
if (!avctx->refcounted_frames)
|
||||
av_frame_unref(&avci->to_free);
|
||||
|
||||
if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size) {
|
||||
if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type & FF_THREAD_FRAME)) {
|
||||
uint8_t *side;
|
||||
int side_size;
|
||||
// copy to ensure we do not change avpkt
|
||||
@ -2084,11 +2084,15 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
|
||||
apply_param_change(avctx, &tmp);
|
||||
|
||||
avctx->pkt = &tmp;
|
||||
ret = avctx->codec->decode(avctx, frame, got_frame_ptr, &tmp);
|
||||
if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
|
||||
ret = ff_thread_decode_frame(avctx, frame, got_frame_ptr, &tmp);
|
||||
else {
|
||||
ret = avctx->codec->decode(avctx, frame, got_frame_ptr, &tmp);
|
||||
frame->pkt_dts = avpkt->dts;
|
||||
}
|
||||
if (ret >= 0 && *got_frame_ptr) {
|
||||
add_metadata_from_side_data(avctx, frame);
|
||||
avctx->frame_number++;
|
||||
frame->pkt_dts = avpkt->dts;
|
||||
av_frame_set_best_effort_timestamp(frame,
|
||||
guess_correct_pts(avctx,
|
||||
frame->pkt_pts,
|
||||
|
@ -3179,7 +3179,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
find_stream_info_err:
|
||||
for (i=0; i < ic->nb_streams; i++) {
|
||||
st = ic->streams[i];
|
||||
if (ic->streams[i]->codec)
|
||||
if (ic->streams[i]->codec && ic->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
|
||||
ic->streams[i]->codec->thread_count = 0;
|
||||
if (st->info)
|
||||
av_freep(&st->info->duration_error);
|
||||
|
Loading…
Reference in New Issue
Block a user