avformat/vpcc: Calculate VP9 level from Luma's Sample rate and Picture size
authorKarthick Jeyapal <kjeyapal@akamai.com>
Mon, 23 Apr 2018 06:10:31 +0000 (11:40 +0530)
committerKarthick Jeyapal <kjeyapal@akamai.com>
Thu, 26 Apr 2018 08:53:08 +0000 (14:23 +0530)
libavformat/vpcc.c
libavformat/vpcc.h

index 66d0df6..7951448 100644 (file)
@@ -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;
 
index d71ba05..e87bec5 100644 (file)
@@ -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 */