[FFmpeg-cvslog] h264: remove an artificial restriction on the number of slice threads
Anton Khirnov
git at videolan.org
Tue Jun 21 10:24:48 CEST 2016
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Wed Apr 13 17:28:26 2016 +0200| [e0652795292223f8bc8e5bac019c1fca7323d23c] | committer: Anton Khirnov
h264: remove an artificial restriction on the number of slice threads
This limit is now unnecessary, we can easily support an arbitrary number
of threads.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e0652795292223f8bc8e5bac019c1fca7323d23c
---
libavcodec/h264.c | 5 ++---
libavcodec/h264.h | 3 ---
libavcodec/h264_slice.c | 17 +----------------
3 files changed, 3 insertions(+), 22 deletions(-)
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 27cbcd2..b8dfbf6 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -285,7 +285,6 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h)
h->avctx = avctx;
h->picture_structure = PICT_FRAME;
- h->slice_context_count = 1;
h->workaround_bugs = avctx->workaround_bugs;
h->flags = avctx->flags;
h->poc.prev_poc_msb = 1 << 16;
@@ -300,7 +299,7 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h)
avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
- h->nb_slice_ctx = (avctx->active_thread_type & FF_THREAD_SLICE) ? H264_MAX_THREADS : 1;
+ h->nb_slice_ctx = (avctx->active_thread_type & FF_THREAD_SLICE) ? avctx->thread_count : 1;
h->slice_ctx = av_mallocz_array(h->nb_slice_ctx, sizeof(*h->slice_ctx));
if (!h->slice_ctx) {
h->nb_slice_ctx = 0;
@@ -809,7 +808,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
int nals_needed = 0; ///< number of NALs that need decoding before the next frame thread starts
int i, ret = 0;
- h->max_contexts = h->slice_context_count;
+ h->max_contexts = h->nb_slice_ctx;
if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS)) {
h->current_slice = 0;
if (!h->first_field)
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 5c2c810..cb38664 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -49,7 +49,6 @@
#include "videodsp.h"
#define H264_MAX_PICTURE_COUNT 32
-#define H264_MAX_THREADS 16
#define MAX_SPS_COUNT 32
#define MAX_PPS_COUNT 256
@@ -593,8 +592,6 @@ typedef struct H264Context {
*/
int max_contexts;
- int slice_context_count;
-
/** @} */
/**
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 4c52eff..e0e3577 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -829,9 +829,6 @@ static int init_dimensions(H264Context *h)
static int h264_slice_header_init(H264Context *h)
{
const SPS *sps = h->ps.sps;
- int nb_slices = (HAVE_THREADS &&
- h->avctx->active_thread_type & FF_THREAD_SLICE) ?
- h->avctx->thread_count : 1;
int i, ret;
ff_set_sar(h->avctx, sps->sar);
@@ -877,18 +874,6 @@ static int h264_slice_header_init(H264Context *h)
sps->chroma_format_idc);
ff_videodsp_init(&h->vdsp, sps->bit_depth_luma);
- if (nb_slices > H264_MAX_THREADS || (nb_slices > h->mb_height && h->mb_height)) {
- int max_slices;
- if (h->mb_height)
- max_slices = FFMIN(H264_MAX_THREADS, h->mb_height);
- else
- max_slices = H264_MAX_THREADS;
- av_log(h->avctx, AV_LOG_WARNING, "too many threads/slices %d,"
- " reducing to %d\n", nb_slices, max_slices);
- nb_slices = max_slices;
- }
- h->slice_context_count = nb_slices;
-
if (!HAVE_THREADS || !(h->avctx->active_thread_type & FF_THREAD_SLICE)) {
ret = ff_h264_slice_context_init(h, &h->slice_ctx[0]);
if (ret < 0) {
@@ -896,7 +881,7 @@ static int h264_slice_header_init(H264Context *h)
return ret;
}
} else {
- for (i = 0; i < h->slice_context_count; i++) {
+ for (i = 0; i < h->nb_slice_ctx; i++) {
H264SliceContext *sl = &h->slice_ctx[i];
sl->h264 = h;
More information about the ffmpeg-cvslog
mailing list