[FFmpeg-devel] [PATCH v2 1/3] avformat/vpcc: Calculate VP9 level from Luma's Sample rate and Picture size

Karthick J kjeyapal at akamai.com
Mon Apr 23 09:10:31 EEST 2018


From: Karthick Jeyapal <kjeyapal at akamai.com>

---
 libavformat/vpcc.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 libavformat/vpcc.h |  2 +-
 2 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/libavformat/vpcc.c b/libavformat/vpcc.c
index 66d0df6..7951448 100644
--- a/libavformat/vpcc.c
+++ b/libavformat/vpcc.c
@@ -67,11 +67,58 @@ static int get_vpx_video_full_range_flag(enum AVColorRange color_range)
     return color_range == AVCOL_RANGE_JPEG;
 }
 
+// Find approximate VP9 level based on the Luma's Sample rate and Picture size.
+static int get_vp9_level(AVCodecParameters *par, AVRational *frame_rate) {
+    int picture_size = par->width * par->height;
+    int64_t sample_rate;
+
+    // All decisions will be based on picture_size, if frame rate is missing/invalid
+    if (!frame_rate || !frame_rate->den)
+        sample_rate = 0;
+    else
+        sample_rate = ((int64_t)picture_size * frame_rate->num) / frame_rate->den;
+
+    if (picture_size <= 0) {
+        return 0;
+    } else if (sample_rate <= 829440     && picture_size <= 36864) {
+        return 0x10;
+    } else if (sample_rate <= 2764800    && picture_size <= 73728) {
+        return 0x11;
+    } else if (sample_rate <= 4608000    && picture_size <= 122880) {
+        return 0x20;
+    } else if (sample_rate <= 9216000    && picture_size <= 245760) {
+        return 0x21;
+    } else if (sample_rate <= 20736000   && picture_size <= 552960) {
+        return 0x30;
+    } else if (sample_rate <= 36864000   && picture_size <= 983040) {
+        return 0x31;
+    } else if (sample_rate <= 83558400   && picture_size <= 2228224) {
+        return 0x40;
+    } else if (sample_rate <= 160432128  && picture_size <= 2228224) {
+        return 0x41;
+    } else if (sample_rate <= 311951360  && picture_size <= 8912896) {
+        return 0x50;
+    } else if (sample_rate <= 588251136  && picture_size <= 8912896) {
+        return 0x51;
+    } else if (sample_rate <= 1176502272 && picture_size <= 8912896) {
+        return 0x52;
+    } else if (sample_rate <= 1176502272 && picture_size <= 35651584) {
+        return 0x60;
+    } else if (sample_rate <= 2353004544 && picture_size <= 35651584) {
+        return 0x61;
+    } else if (sample_rate <= 4706009088 && picture_size <= 35651584) {
+        return 0x62;
+    } else {
+        return 0;
+    }
+}
+
 int ff_isom_get_vpcc_features(AVFormatContext *s, AVCodecParameters *par,
-                              VPCC *vpcc)
+                              AVRational *frame_rate, VPCC *vpcc)
 {
     int profile = par->profile;
-    int level = par->level == FF_LEVEL_UNKNOWN ? 0 : par->level;
+    int level = par->level == FF_LEVEL_UNKNOWN ?
+        get_vp9_level(par, frame_rate) : par->level;
     int bit_depth = get_bit_depth(s, par->format);
     int vpx_chroma_subsampling =
         get_vpx_chroma_subsampling(s, par->format, par->chroma_location);
@@ -105,7 +152,7 @@ int ff_isom_write_vpcc(AVFormatContext *s, AVIOContext *pb,
     VPCC vpcc;
     int ret;
 
-    ret = ff_isom_get_vpcc_features(s, par, &vpcc);
+    ret = ff_isom_get_vpcc_features(s, par, NULL, &vpcc);
     if (ret < 0)
         return ret;
 
diff --git a/libavformat/vpcc.h b/libavformat/vpcc.h
index d71ba05..e87bec5 100644
--- a/libavformat/vpcc.h
+++ b/libavformat/vpcc.h
@@ -53,6 +53,6 @@ int ff_isom_write_vpcc(AVFormatContext *s, AVIOContext *pb,
                        AVCodecParameters *par);
 
 int ff_isom_get_vpcc_features(AVFormatContext *s, AVCodecParameters *par,
-                              VPCC *vpcc);
+                              AVRational *frame_rate, VPCC *vpcc);
 
 #endif /* AVFORMAT_VPCC_H */
-- 
2.7.4



More information about the ffmpeg-devel mailing list