mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avformat/vpcc: Calculate VP9 level from Luma's Sample rate and Picture size
This commit is contained in:
parent
798ae8794e
commit
5b6cc3a73a
@ -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;
|
||||
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user