[FFmpeg-cvslog] hevc: Move hevc_decode_extradata before frame decoding
Vittorio Giovara
git at videolan.org
Thu Nov 3 20:07:29 EET 2016
ffmpeg | branch: master | Vittorio Giovara <vittorio.giovara at gmail.com> | Wed Nov 2 11:48:57 2016 -0400| [067910ed134461fd3afc42c82a401e952bd2172f] | committer: Michael Niedermayer
hevc: Move hevc_decode_extradata before frame decoding
Avoids a forward-declaration in the following commit.
Signed-off-by: Vittorio Giovara <vittorio.giovara at gmail.com>
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=067910ed134461fd3afc42c82a401e952bd2172f
---
libavcodec/hevc.c | 148 +++++++++++++++++++++++++++---------------------------
1 file changed, 74 insertions(+), 74 deletions(-)
diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 764e093..29e0d49 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -2973,6 +2973,80 @@ static int verify_md5(HEVCContext *s, AVFrame *frame)
return 0;
}
+static int hevc_decode_extradata(HEVCContext *s)
+{
+ AVCodecContext *avctx = s->avctx;
+ GetByteContext gb;
+ int ret, i;
+
+ bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
+
+ if (avctx->extradata_size > 3 &&
+ (avctx->extradata[0] || avctx->extradata[1] ||
+ avctx->extradata[2] > 1)) {
+ /* It seems the extradata is encoded as hvcC format.
+ * Temporarily, we support configurationVersion==0 until 14496-15 3rd
+ * is finalized. When finalized, configurationVersion will be 1 and we
+ * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
+ int i, j, num_arrays, nal_len_size;
+
+ s->is_nalff = 1;
+
+ bytestream2_skip(&gb, 21);
+ nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
+ num_arrays = bytestream2_get_byte(&gb);
+
+ /* nal units in the hvcC always have length coded with 2 bytes,
+ * so put a fake nal_length_size = 2 while parsing them */
+ s->nal_length_size = 2;
+
+ /* Decode nal units from hvcC. */
+ for (i = 0; i < num_arrays; i++) {
+ int type = bytestream2_get_byte(&gb) & 0x3f;
+ int cnt = bytestream2_get_be16(&gb);
+
+ for (j = 0; j < cnt; j++) {
+ // +2 for the nal size field
+ int nalsize = bytestream2_peek_be16(&gb) + 2;
+ if (bytestream2_get_bytes_left(&gb) < nalsize) {
+ av_log(s->avctx, AV_LOG_ERROR,
+ "Invalid NAL unit size in extradata.\n");
+ return AVERROR_INVALIDDATA;
+ }
+
+ ret = decode_nal_units(s, gb.buffer, nalsize);
+ if (ret < 0) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Decoding nal unit %d %d from hvcC failed\n",
+ type, i);
+ return ret;
+ }
+ bytestream2_skip(&gb, nalsize);
+ }
+ }
+
+ /* Now store right nal length size, that will be used to parse
+ * all other nals */
+ s->nal_length_size = nal_len_size;
+ } else {
+ s->is_nalff = 0;
+ ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size);
+ if (ret < 0)
+ return ret;
+ }
+
+ /* export stream parameters from the first SPS */
+ for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
+ if (s->ps.sps_list[i]) {
+ const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
+ export_stream_params(s->avctx, &s->ps, sps);
+ break;
+ }
+ }
+
+ return 0;
+}
+
static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
AVPacket *avpkt)
{
@@ -3243,80 +3317,6 @@ static int hevc_update_thread_context(AVCodecContext *dst,
return 0;
}
-static int hevc_decode_extradata(HEVCContext *s)
-{
- AVCodecContext *avctx = s->avctx;
- GetByteContext gb;
- int ret, i;
-
- bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
-
- if (avctx->extradata_size > 3 &&
- (avctx->extradata[0] || avctx->extradata[1] ||
- avctx->extradata[2] > 1)) {
- /* It seems the extradata is encoded as hvcC format.
- * Temporarily, we support configurationVersion==0 until 14496-15 3rd
- * is finalized. When finalized, configurationVersion will be 1 and we
- * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
- int i, j, num_arrays, nal_len_size;
-
- s->is_nalff = 1;
-
- bytestream2_skip(&gb, 21);
- nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
- num_arrays = bytestream2_get_byte(&gb);
-
- /* nal units in the hvcC always have length coded with 2 bytes,
- * so put a fake nal_length_size = 2 while parsing them */
- s->nal_length_size = 2;
-
- /* Decode nal units from hvcC. */
- for (i = 0; i < num_arrays; i++) {
- int type = bytestream2_get_byte(&gb) & 0x3f;
- int cnt = bytestream2_get_be16(&gb);
-
- for (j = 0; j < cnt; j++) {
- // +2 for the nal size field
- int nalsize = bytestream2_peek_be16(&gb) + 2;
- if (bytestream2_get_bytes_left(&gb) < nalsize) {
- av_log(s->avctx, AV_LOG_ERROR,
- "Invalid NAL unit size in extradata.\n");
- return AVERROR_INVALIDDATA;
- }
-
- ret = decode_nal_units(s, gb.buffer, nalsize);
- if (ret < 0) {
- av_log(avctx, AV_LOG_ERROR,
- "Decoding nal unit %d %d from hvcC failed\n",
- type, i);
- return ret;
- }
- bytestream2_skip(&gb, nalsize);
- }
- }
-
- /* Now store right nal length size, that will be used to parse
- * all other nals */
- s->nal_length_size = nal_len_size;
- } else {
- s->is_nalff = 0;
- ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size);
- if (ret < 0)
- return ret;
- }
-
- /* export stream parameters from the first SPS */
- for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
- if (s->ps.sps_list[i]) {
- const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
- export_stream_params(s->avctx, &s->ps, sps);
- break;
- }
- }
-
- return 0;
-}
-
static av_cold int hevc_decode_init(AVCodecContext *avctx)
{
HEVCContext *s = avctx->priv_data;
More information about the ffmpeg-cvslog
mailing list