ffmpeg: hevc: Fixes for ffmpeg 4

This commit is contained in:
MilhouseVH 2018-06-02 14:51:29 +01:00
parent c55b87ed1e
commit d1b27be7c5

View File

@ -16771,10 +16771,10 @@ index 0000000000..4bfa000da4
+ +
diff --git a/libavcodec/rpi_hevc_mvs.c b/libavcodec/rpi_hevc_mvs.c diff --git a/libavcodec/rpi_hevc_mvs.c b/libavcodec/rpi_hevc_mvs.c
new file mode 100644 new file mode 100644
index 0000000000..93f3530ff5 index 0000000000..93a6294c76
--- /dev/null --- /dev/null
+++ b/libavcodec/rpi_hevc_mvs.c +++ b/libavcodec/rpi_hevc_mvs.c
@@ -0,0 +1,761 @@ @@ -0,0 +1,759 @@
+/* +/*
+ * HEVC video decoder + * HEVC video decoder
+ * + *
@ -17017,7 +17017,6 @@ index 0000000000..93f3530ff5
+ x < s->ps.sps->width) { + x < s->ps.sps->width) {
+ x &= ~15; + x &= ~15;
+ y &= ~15; + y &= ~15;
+ if (s->threads_type == FF_THREAD_FRAME)
+ ff_hevc_rpi_progress_wait_mv(s, lc->jb0, ref, y); + ff_hevc_rpi_progress_wait_mv(s, lc->jb0, ref, y);
+ x_pu = x >> s->ps.sps->log2_min_pu_size; + x_pu = x >> s->ps.sps->log2_min_pu_size;
+ y_pu = y >> s->ps.sps->log2_min_pu_size; + y_pu = y >> s->ps.sps->log2_min_pu_size;
@ -17031,7 +17030,6 @@ index 0000000000..93f3530ff5
+ y = y0 + (nPbH >> 1); + y = y0 + (nPbH >> 1);
+ x &= ~15; + x &= ~15;
+ y &= ~15; + y &= ~15;
+ if (s->threads_type == FF_THREAD_FRAME)
+ ff_hevc_rpi_progress_wait_mv(s, lc->jb0, ref, y); + ff_hevc_rpi_progress_wait_mv(s, lc->jb0, ref, y);
+ x_pu = x >> s->ps.sps->log2_min_pu_size; + x_pu = x >> s->ps.sps->log2_min_pu_size;
+ y_pu = y >> s->ps.sps->log2_min_pu_size; + y_pu = y >> s->ps.sps->log2_min_pu_size;
@ -19691,10 +19689,10 @@ index 0000000000..744e7cf248
+} +}
diff --git a/libavcodec/rpi_hevc_ps.h b/libavcodec/rpi_hevc_ps.h diff --git a/libavcodec/rpi_hevc_ps.h b/libavcodec/rpi_hevc_ps.h
new file mode 100644 new file mode 100644
index 0000000000..1e7120a43d index 0000000000..00c1f14614
--- /dev/null --- /dev/null
+++ b/libavcodec/rpi_hevc_ps.h +++ b/libavcodec/rpi_hevc_ps.h
@@ -0,0 +1,441 @@ @@ -0,0 +1,444 @@
+/* +/*
+ * HEVC parameter set parsing + * HEVC parameter set parsing
+ * + *
@ -19803,6 +19801,9 @@ index 0000000000..1e7120a43d
+ int num_entry_point_offsets; + int num_entry_point_offsets;
+ int offsets_allocated; + int offsets_allocated;
+ +
+ uint8_t offload_wpp;
+ uint8_t offload_tiles;
+
+ int8_t slice_qp; + int8_t slice_qp;
+ +
+ uint8_t luma_log2_weight_denom; + uint8_t luma_log2_weight_denom;
@ -25929,10 +25930,10 @@ index 0000000000..1128a2c054
+}; +};
diff --git a/libavcodec/rpi_hevcdec.c b/libavcodec/rpi_hevcdec.c diff --git a/libavcodec/rpi_hevcdec.c b/libavcodec/rpi_hevcdec.c
new file mode 100644 new file mode 100644
index 0000000000..08686ff260 index 0000000000..bddf0c3417
--- /dev/null --- /dev/null
+++ b/libavcodec/rpi_hevcdec.c +++ b/libavcodec/rpi_hevcdec.c
@@ -0,0 +1,5787 @@ @@ -0,0 +1,5782 @@
+/* +/*
+ * HEVC video Decoder + * HEVC video Decoder
+ * + *
@ -26911,7 +26912,10 @@ index 0000000000..08686ff260
+ goto fail; + goto fail;
+ +
+ s->tab_ipm = av_mallocz(min_pu_size); + s->tab_ipm = av_mallocz(min_pu_size);
+ s->is_pcm = av_malloc_array(sps->pcm_width, sps->pcm_height); + // We can overread by 1 line & one byte in deblock so alloc & zero
+ // We don't need to zero the extra @ start of frame as it will never be
+ // written
+ s->is_pcm = av_mallocz(sps->pcm_width * (sps->pcm_height + 1) + 1);
+ if (!s->tab_ipm || !s->is_pcm) + if (!s->tab_ipm || !s->is_pcm)
+ goto fail; + goto fail;
+ +
@ -27645,6 +27649,9 @@ index 0000000000..08686ff260
+ } + }
+ +
+ sh->num_entry_point_offsets = 0; + sh->num_entry_point_offsets = 0;
+ sh->offload_wpp = 0;
+ sh->offload_wpp = 0;
+
+ if (s->ps.pps->tiles_enabled_flag || s->ps.pps->entropy_coding_sync_enabled_flag) { + if (s->ps.pps->tiles_enabled_flag || s->ps.pps->entropy_coding_sync_enabled_flag) {
+ unsigned num_entry_point_offsets = get_ue_golomb_long(gb); + unsigned num_entry_point_offsets = get_ue_golomb_long(gb);
+ // It would be possible to bound this tighter but this here is simpler + // It would be possible to bound this tighter but this here is simpler
@ -27681,6 +27688,18 @@ index 0000000000..08686ff260
+ } + }
+ sh->entry_point_offset[i] = val_minus1 + 1; // +1 to get the size + sh->entry_point_offset[i] = val_minus1 + 1; // +1 to get the size
+ } + }
+
+ // Do we want to offload this
+ if (s->threads_type != 0)
+ {
+ sh->offload_wpp = (!s->ps.pps->tile_wpp_inter_disable || sh->slice_type == HEVC_SLICE_I) &&
+ s->ps.pps->num_tile_columns > 1;
+ // * We only cope with WPP in a single column
+ // Probably want to deal with that case as tiles rather than WPP anyway
+ // ?? Not actually sure that the main code deals with WPP + multi-col correctly
+ sh->offload_wpp = s->ps.pps->entropy_coding_sync_enabled_flag &&
+ s->ps.pps->num_tile_columns == 1;
+ }
+ } + }
+ } + }
+ +
@ -28231,7 +28250,7 @@ index 0000000000..08686ff260
+static void hevc_await_progress(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, const HEVCFrame * const ref, +static void hevc_await_progress(const HEVCRpiContext * const s, HEVCRpiLocalContext * const lc, const HEVCFrame * const ref,
+ const Mv * const mv, const int y0, const int height) + const Mv * const mv, const int y0, const int height)
+{ +{
+ if (s->threads_type == FF_THREAD_FRAME) { + if (s->threads_type != 0) {
+ const int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9); + const int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9);
+ +
+ // Progress has to be attached to current job as the actual wait + // Progress has to be attached to current job as the actual wait
@ -29408,7 +29427,7 @@ index 0000000000..08686ff260
+ (s->ps.pps->ctb_ts_flags[jb->ctu_ts_last] & CTB_TS_FLAGS_EOT) != 0); + (s->ps.pps->ctb_ts_flags[jb->ctu_ts_last] & CTB_TS_FLAGS_EOT) != 0);
+ +
+ // Signal + // Signal
+ if (s->threads_type == FF_THREAD_FRAME && y > 0) { + if (y > 0) {
+ // Cast away const as progress is held in s, but this really shouldn't confuse anything + // Cast away const as progress is held in s, but this really shouldn't confuse anything
+ ff_hevc_rpi_progress_signal_recon((HEVCRpiContext *)s, y - 1); + ff_hevc_rpi_progress_signal_recon((HEVCRpiContext *)s, y - 1);
+ } + }
@ -30179,7 +30198,7 @@ index 0000000000..08686ff260
+ ff_hevc_rpi_save_states(s, lc); + ff_hevc_rpi_save_states(s, lc);
+ +
+ // Report progress so we can use our MVs in other frames + // Report progress so we can use our MVs in other frames
+ if (s->threads_type == FF_THREAD_FRAME && (ctb_flags & CTB_TS_FLAGS_EOL) != 0) + if ((ctb_flags & CTB_TS_FLAGS_EOL) != 0)
+ ff_hevc_rpi_progress_signal_mv(s, y_ctb + ctb_size - 1); + ff_hevc_rpi_progress_signal_mv(s, y_ctb + ctb_size - 1);
+ +
+ // End of line || End of tile line || End of tile + // End of line || End of tile line || End of tile
@ -30593,9 +30612,7 @@ index 0000000000..08686ff260
+ +
+#if RPI_EXTRA_BIT_THREADS > 0 +#if RPI_EXTRA_BIT_THREADS > 0
+ +
+ if (s->sh.num_entry_point_offsets != 0 && + if (s->sh.offload_tiles)
+ (!s->ps.pps->tile_wpp_inter_disable || s->sh.slice_type == HEVC_SLICE_I) &&
+ s->ps.pps->num_tile_columns > 1)
+ { + {
+ unsigned int slice_row = 0; + unsigned int slice_row = 0;
+ +
@ -30640,14 +30657,7 @@ index 0000000000..08686ff260
+ printf("%s: Done wait: ts=%d\n", __func__, lc->ts); + printf("%s: Done wait: ts=%d\n", __func__, lc->ts);
+#endif +#endif
+ } + }
+ else + else if (s->sh.offload_wpp)
+
+ // * We only cope with WPP in a single column
+ // Probably want to deal with that case as tiles rather than WPP anyway
+ // ?? Not actually sure that the main code deals with WPP + multi-col correctly
+ if (s->ps.pps->entropy_coding_sync_enabled_flag &&
+ s->ps.pps->num_tile_columns == 1 &&
+ s->sh.num_entry_point_offsets != 0)
+ { + {
+#if TRACE_WPP +#if TRACE_WPP
+ printf("%s: Do WPP\n", __func__); + printf("%s: Do WPP\n", __func__);
@ -31002,8 +31012,7 @@ index 0000000000..08686ff260
+ s->nal_unit_type == HEVC_NAL_STSA_N || + s->nal_unit_type == HEVC_NAL_STSA_N ||
+ s->nal_unit_type == HEVC_NAL_RADL_N || + s->nal_unit_type == HEVC_NAL_RADL_N ||
+ s->nal_unit_type == HEVC_NAL_RASL_N); + s->nal_unit_type == HEVC_NAL_RASL_N);
+ s->offload_recon = s->used_for_ref; + s->offload_recon = s->threads_type != 0 && s->used_for_ref;
+// s->offload_recon = 0;
+ +
+#if DEBUG_DECODE_N +#if DEBUG_DECODE_N
+ { + {
@ -31145,7 +31154,7 @@ index 0000000000..08686ff260
+ +
+fail: // Also success path +fail: // Also success path
+ if (s->ref != NULL) { + if (s->ref != NULL) {
+ if (s->used_for_ref && s->threads_type == FF_THREAD_FRAME) { + if (s->used_for_ref && s->threads_type != 0) {
+ ff_hevc_rpi_progress_signal_all_done(s); + ff_hevc_rpi_progress_signal_all_done(s);
+ } + }
+ else { + else {
@ -31394,12 +31403,6 @@ index 0000000000..08686ff260
+ s->ps.pps = NULL; + s->ps.pps = NULL;
+ s->ps.vps = NULL; + s->ps.vps = NULL;
+ +
+ for (i = 1; i < s->threads_number; i++) {
+ if (s->sList[i] != NULL) {
+ av_freep(&s->sList[i]);
+ }
+ }
+
+ // Free separately from sLists as used that way by RPI WPP + // Free separately from sLists as used that way by RPI WPP
+ for (i = 0; i < MAX_NB_THREADS && s->HEVClcList[i] != NULL; ++i) { + for (i = 0; i < MAX_NB_THREADS && s->HEVClcList[i] != NULL; ++i) {
+ av_freep(s->HEVClcList + i); + av_freep(s->HEVClcList + i);
@ -31428,7 +31431,6 @@ index 0000000000..08686ff260
+ if (!s->HEVClc) + if (!s->HEVClc)
+ goto fail; + goto fail;
+ s->HEVClcList[0] = s->HEVClc; + s->HEVClcList[0] = s->HEVClc;
+ s->sList[0] = s;
+ +
+ // Whilst FFmpegs init fn is only called once the close fn is called as + // Whilst FFmpegs init fn is only called once the close fn is called as
+ // many times as we have threads (init_thread_copy is called for the + // many times as we have threads (init_thread_copy is called for the
@ -31553,7 +31555,6 @@ index 0000000000..08686ff260
+ s->is_nalff = s0->is_nalff; + s->is_nalff = s0->is_nalff;
+ s->nal_length_size = s0->nal_length_size; + s->nal_length_size = s0->nal_length_size;
+ +
+ s->threads_number = s0->threads_number;
+ s->threads_type = s0->threads_type; + s->threads_type = s0->threads_type;
+ +
+ if (s0->eos) { + if (s0->eos) {
@ -31611,11 +31612,6 @@ index 0000000000..08686ff260
+ +
+ atomic_init(&s->wpp_err, 0); + atomic_init(&s->wpp_err, 0);
+ +
+ if(avctx->active_thread_type & FF_THREAD_SLICE)
+ s->threads_number = avctx->thread_count;
+ else
+ s->threads_number = 1;
+
+ if (avctx->extradata_size > 0 && avctx->extradata) { + if (avctx->extradata_size > 0 && avctx->extradata) {
+ ret = hevc_rpi_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1); + ret = hevc_rpi_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
+ +
@ -31632,7 +31628,7 @@ index 0000000000..08686ff260
+ if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1) + if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1)
+ s->threads_type = FF_THREAD_FRAME; + s->threads_type = FF_THREAD_FRAME;
+ else + else
+ s->threads_type = FF_THREAD_SLICE; + s->threads_type = 0;
+ +
+ return 0; + return 0;
+} +}
@ -31722,10 +31718,10 @@ index 0000000000..08686ff260
+ +
diff --git a/libavcodec/rpi_hevcdec.h b/libavcodec/rpi_hevcdec.h diff --git a/libavcodec/rpi_hevcdec.h b/libavcodec/rpi_hevcdec.h
new file mode 100644 new file mode 100644
index 0000000000..df2bac1df4 index 0000000000..d242727b2a
--- /dev/null --- /dev/null
+++ b/libavcodec/rpi_hevcdec.h +++ b/libavcodec/rpi_hevcdec.h
@@ -0,0 +1,1002 @@ @@ -0,0 +1,1000 @@
+/* +/*
+ * HEVC video decoder + * HEVC video decoder
+ * + *
@ -32430,13 +32426,10 @@ index 0000000000..df2bac1df4
+ const AVClass *c; // needed by private avoptions + const AVClass *c; // needed by private avoptions
+ AVCodecContext *avctx; + AVCodecContext *avctx;
+ +
+ struct HEVCRpiContext *sList[MAX_NB_THREADS];
+
+ HEVCRpiLocalContext *HEVClcList[MAX_NB_THREADS]; + HEVCRpiLocalContext *HEVClcList[MAX_NB_THREADS];
+ HEVCRpiLocalContext *HEVClc; + HEVCRpiLocalContext *HEVClc;
+ +
+ uint8_t threads_type; + uint8_t threads_type;
+ uint8_t threads_number;
+ +
+ /** 1 if the independent slice segment header was successfully parsed */ + /** 1 if the independent slice segment header was successfully parsed */
+ uint8_t slice_initialized; + uint8_t slice_initialized;
@ -32641,12 +32634,13 @@ index 0000000000..df2bac1df4
+static inline void ff_hevc_rpi_progress_wait_mv(const HEVCRpiContext * const s, HEVCRpiJob * const jb, +static inline void ff_hevc_rpi_progress_wait_mv(const HEVCRpiContext * const s, HEVCRpiJob * const jb,
+ const HEVCFrame * const ref, const int y) + const HEVCFrame * const ref, const int y)
+{ +{
+ if (s->threads_type != 0)
+ ff_hevc_rpi_progress_wait_field(s, jb, ref, y, 1); + ff_hevc_rpi_progress_wait_field(s, jb, ref, y, 1);
+} +}
+ +
+static inline void ff_hevc_rpi_progress_signal_mv(HEVCRpiContext * const s, const int y) +static inline void ff_hevc_rpi_progress_signal_mv(HEVCRpiContext * const s, const int y)
+{ +{
+ if (s->used_for_ref) + if (s->used_for_ref && s->threads_type != 0)
+ ff_hevc_rpi_progress_signal_field(s, y, 1); + ff_hevc_rpi_progress_signal_field(s, y, 1);
+} +}
+ +
@ -32658,7 +32652,7 @@ index 0000000000..df2bac1df4
+ +
+static inline void ff_hevc_rpi_progress_signal_recon(HEVCRpiContext * const s, const int y) +static inline void ff_hevc_rpi_progress_signal_recon(HEVCRpiContext * const s, const int y)
+{ +{
+ if (s->used_for_ref) + if (s->used_for_ref && s->threads_type != 0)
+ { + {
+ ff_hevc_rpi_progress_signal_field(s, y, 0); + ff_hevc_rpi_progress_signal_field(s, y, 0);
+ } + }
@ -33344,7 +33338,7 @@ index 0000000000..8c9bf725bf
+#endif /* AVCODEC_RPI_HEVCDSP_H */ +#endif /* AVCODEC_RPI_HEVCDSP_H */
diff --git a/libavcodec/rpi_hevcdsp_template.c b/libavcodec/rpi_hevcdsp_template.c diff --git a/libavcodec/rpi_hevcdsp_template.c b/libavcodec/rpi_hevcdsp_template.c
new file mode 100644 new file mode 100644
index 0000000000..cfe9264fc3 index 0000000000..d1196a4440
--- /dev/null --- /dev/null
+++ b/libavcodec/rpi_hevcdsp_template.c +++ b/libavcodec/rpi_hevcdsp_template.c
@@ -0,0 +1,2278 @@ @@ -0,0 +1,2278 @@
@ -33929,7 +33923,7 @@ index 0000000000..cfe9264fc3
+ pixel *src = (pixel *)_src; + pixel *src = (pixel *)_src;
+ int a_stride, b_stride; + int a_stride, b_stride;
+ int x, y; + int x, y;
+ ptrdiff_t stride_src = (2*MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / sizeof(pixel); + const ptrdiff_t stride_src = RPI_HEVC_SAO_BUF_STRIDE / sizeof(pixel);
+ stride_dst /= sizeof(pixel); + stride_dst /= sizeof(pixel);
+ +
+ a_stride = pos[eo][0][0] + pos[eo][0][1] * stride_src; + a_stride = pos[eo][0][0] + pos[eo][0][1] * stride_src;
@ -34157,7 +34151,7 @@ index 0000000000..cfe9264fc3
+ pixel *src = (pixel *)_src; + pixel *src = (pixel *)_src;
+ int a_stride, b_stride; + int a_stride, b_stride;
+ int x, y; + int x, y;
+ ptrdiff_t stride_src = (2*MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / sizeof(pixel); + const ptrdiff_t stride_src = RPI_HEVC_SAO_BUF_STRIDE / sizeof(pixel);
+ +
+ stride_dst /= sizeof(pixel); + stride_dst /= sizeof(pixel);
+ width *= 2; + width *= 2;