[FFmpeg-cvslog] h264_parser: export video format and dimensions
Anton Khirnov
git at videolan.org
Thu Feb 19 20:49:47 CET 2015
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Mon Feb 9 14:41:50 2015 +0100| [31d2039cb42668ebcf08248bc48bbad44aa05f49] | committer: Anton Khirnov
h264_parser: export video format and dimensions
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=31d2039cb42668ebcf08248bc48bbad44aa05f49
---
doc/APIchanges | 4 ++++
libavcodec/avcodec.h | 22 ++++++++++++++++++++++
libavcodec/h264_parser.c | 29 +++++++++++++++++++++++++++++
libavcodec/parser.c | 2 ++
libavcodec/version.h | 2 +-
5 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index 18e8d5e..cf8d828 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,10 @@ libavutil: 2014-08-09
API changes, most recent first:
+2015-xx-xx - xxxxxxx - lavc 56.13
+ Add width, height, coded_width, coded_height and format to
+ AVCodecParserContext.
+
2015-xx-xx - xxxxxxx - lavu 54.9.0
Add AV_PIX_FMT_QSV for QSV hardware acceleration.
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 231b92b..5b5c21f 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3883,6 +3883,28 @@ typedef struct AVCodecParserContext {
* For example, this corresponds to H.264 PicOrderCnt.
*/
int output_picture_number;
+
+ /**
+ * Dimensions of the decoded video intended for presentation.
+ */
+ int width;
+ int height;
+
+ /**
+ * Dimensions of the coded video.
+ */
+ int coded_width;
+ int coded_height;
+
+ /**
+ * The format of the coded data, corresponds to enum AVPixelFormat for video
+ * and for enum AVSampleFormat for audio.
+ *
+ * Note that a decoder can have considerable freedom in how exactly it
+ * decodes the data, so the format reported here might be different from the
+ * one returned by a decoder.
+ */
+ int format;
} AVCodecParserContext;
typedef struct AVCodecParser {
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index 693af00..21e320d 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -275,6 +275,35 @@ static inline int parse_nal_units(AVCodecParserContext *s,
h->sps = *h->sps_buffers[h->pps.sps_id];
h->frame_num = get_bits(&h->gb, h->sps.log2_max_frame_num);
+ s->coded_width = 16 * h->sps.mb_width;
+ s->coded_height = 16 * h->sps.mb_height;
+ s->width = s->coded_width - (h->sps.crop_right + h->sps.crop_left);
+ s->height = s->coded_height - (h->sps.crop_top + h->sps.crop_bottom);
+ if (s->width <= 0 || s->height <= 0) {
+ s->width = s->coded_width;
+ s->height = s->coded_height;
+ }
+
+ switch (h->sps.bit_depth_luma) {
+ case 9:
+ if (CHROMA444(h)) s->format = AV_PIX_FMT_YUV444P9;
+ else if (CHROMA422(h)) s->format = AV_PIX_FMT_YUV422P9;
+ else s->format = AV_PIX_FMT_YUV420P9;
+ break;
+ case 10:
+ if (CHROMA444(h)) s->format = AV_PIX_FMT_YUV444P10;
+ else if (CHROMA422(h)) s->format = AV_PIX_FMT_YUV422P10;
+ else s->format = AV_PIX_FMT_YUV420P10;
+ break;
+ case 8:
+ if (CHROMA444(h)) s->format = AV_PIX_FMT_YUV444P;
+ else if (CHROMA422(h)) s->format = AV_PIX_FMT_YUV422P;
+ else s->format = AV_PIX_FMT_YUV420P;
+ break;
+ default:
+ s->format = AV_PIX_FMT_NONE;
+ }
+
avctx->profile = ff_h264_get_profile(&h->sps);
avctx->level = h->sps.level_idc;
diff --git a/libavcodec/parser.c b/libavcodec/parser.c
index 0a5c2ca..4404d97 100644
--- a/libavcodec/parser.c
+++ b/libavcodec/parser.c
@@ -89,6 +89,8 @@ found:
s->dts_sync_point = INT_MIN;
s->dts_ref_dts_delta = INT_MIN;
s->pts_dts_delta = INT_MIN;
+ s->format = -1;
+
return s;
}
diff --git a/libavcodec/version.h b/libavcodec/version.h
index e3168c4..d58e329 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 56
-#define LIBAVCODEC_VERSION_MINOR 12
+#define LIBAVCODEC_VERSION_MINOR 13
#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
More information about the ffmpeg-cvslog
mailing list