FFmpeg
vpcc.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Google Inc.
3  * Copyright (c) 2016 KongQun Yang (kqyang@google.com)
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "libavutil/pixdesc.h"
23 #include "libavutil/pixfmt.h"
24 #include "vpcc.h"
25 
27 {
32 };
33 
35  enum AVPixelFormat pixel_format,
36  enum AVChromaLocation chroma_location)
37 {
38  int chroma_w, chroma_h;
39  if (av_pix_fmt_get_chroma_sub_sample(pixel_format, &chroma_w, &chroma_h) == 0) {
40  if (chroma_w == 1 && chroma_h == 1) {
41  return (chroma_location == AVCHROMA_LOC_LEFT)
44  } else if (chroma_w == 1 && chroma_h == 0) {
45  return VPX_SUBSAMPLING_422;
46  } else if (chroma_w == 0 && chroma_h == 0) {
47  return VPX_SUBSAMPLING_444;
48  }
49  }
50  av_log(s, AV_LOG_ERROR, "Unsupported pixel format (%d)\n", pixel_format);
51  return -1;
52 }
53 
54 static int get_bit_depth(AVFormatContext *s, enum AVPixelFormat pixel_format)
55 {
56  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pixel_format);
57  if (desc == NULL) {
58  av_log(s, AV_LOG_ERROR, "Unsupported pixel format (%d)\n",
59  pixel_format);
60  return -1;
61  }
62  return desc->comp[0].depth;
63 }
64 
66 {
67  return color_range == AVCOL_RANGE_JPEG;
68 }
69 
70 // Find approximate VP9 level based on the Luma's Sample rate and Picture size.
71 static int get_vp9_level(AVCodecParameters *par, AVRational *frame_rate) {
72  int picture_size = par->width * par->height;
73  int64_t sample_rate;
74 
75  // All decisions will be based on picture_size, if frame rate is missing/invalid
76  if (!frame_rate || !frame_rate->den)
77  sample_rate = 0;
78  else
79  sample_rate = ((int64_t)picture_size * frame_rate->num) / frame_rate->den;
80 
81  if (picture_size <= 0) {
82  return 0;
83  } else if (sample_rate <= 829440 && picture_size <= 36864) {
84  return 10;
85  } else if (sample_rate <= 2764800 && picture_size <= 73728) {
86  return 11;
87  } else if (sample_rate <= 4608000 && picture_size <= 122880) {
88  return 20;
89  } else if (sample_rate <= 9216000 && picture_size <= 245760) {
90  return 21;
91  } else if (sample_rate <= 20736000 && picture_size <= 552960) {
92  return 30;
93  } else if (sample_rate <= 36864000 && picture_size <= 983040) {
94  return 31;
95  } else if (sample_rate <= 83558400 && picture_size <= 2228224) {
96  return 40;
97  } else if (sample_rate <= 160432128 && picture_size <= 2228224) {
98  return 41;
99  } else if (sample_rate <= 311951360 && picture_size <= 8912896) {
100  return 50;
101  } else if (sample_rate <= 588251136 && picture_size <= 8912896) {
102  return 51;
103  } else if (sample_rate <= 1176502272 && picture_size <= 8912896) {
104  return 52;
105  } else if (sample_rate <= 1176502272 && picture_size <= 35651584) {
106  return 60;
107  } else if (sample_rate <= 2353004544 && picture_size <= 35651584) {
108  return 61;
109  } else if (sample_rate <= 4706009088 && picture_size <= 35651584) {
110  return 62;
111  } else {
112  return 0;
113  }
114 }
115 
117  AVRational *frame_rate, VPCC *vpcc)
118 {
119  int profile = par->profile;
120  int level = par->level == FF_LEVEL_UNKNOWN ?
121  get_vp9_level(par, frame_rate) : par->level;
122  int bit_depth = get_bit_depth(s, par->format);
123  int vpx_chroma_subsampling =
125  int vpx_video_full_range_flag =
127 
128  if (bit_depth < 0 || vpx_chroma_subsampling < 0)
129  return AVERROR_INVALIDDATA;
130 
131  if (profile == FF_PROFILE_UNKNOWN) {
132  if (vpx_chroma_subsampling == VPX_SUBSAMPLING_420_VERTICAL ||
133  vpx_chroma_subsampling == VPX_SUBSAMPLING_420_COLLOCATED_WITH_LUMA) {
135  } else {
137  }
138  }
139 
140  vpcc->profile = profile;
141  vpcc->level = level;
142  vpcc->bitdepth = bit_depth;
143  vpcc->chroma_subsampling = vpx_chroma_subsampling;
144  vpcc->full_range_flag = vpx_video_full_range_flag;
145 
146  return 0;
147 }
148 
150  AVCodecParameters *par)
151 {
152  VPCC vpcc;
153  int ret;
154 
155  ret = ff_isom_get_vpcc_features(s, par, NULL, &vpcc);
156  if (ret < 0)
157  return ret;
158 
159  avio_w8(pb, vpcc.profile);
160  avio_w8(pb, vpcc.level);
161  avio_w8(pb, (vpcc.bitdepth << 4) | (vpcc.chroma_subsampling << 1) | vpcc.full_range_flag);
162  avio_w8(pb, par->color_primaries);
163  avio_w8(pb, par->color_trc);
164  avio_w8(pb, par->color_space);
165 
166  // vp9 does not have codec initialization data.
167  avio_wb16(pb, 0);
168  return 0;
169 }
bit_depth
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
Definition: af_astats.c:254
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
level
uint8_t level
Definition: svq3.c:206
FF_PROFILE_VP9_0
#define FF_PROFILE_VP9_0
Definition: avcodec.h:1941
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:52
ff_isom_get_vpcc_features
int ff_isom_get_vpcc_features(AVFormatContext *s, AVCodecParameters *par, AVRational *frame_rate, VPCC *vpcc)
Definition: vpcc.c:116
AVCodecParameters::color_space
enum AVColorSpace color_space
Definition: codec_par.h:149
get_vpx_chroma_subsampling
static int get_vpx_chroma_subsampling(AVFormatContext *s, enum AVPixelFormat pixel_format, enum AVChromaLocation chroma_location)
Definition: vpcc.c:34
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2573
VPCC::full_range_flag
int full_range_flag
Definition: vpcc.h:40
profile
mfxU16 profile
Definition: qsvenc.c:45
pixdesc.h
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:586
VPX_SUBSAMPLING_422
@ VPX_SUBSAMPLING_422
Definition: vpcc.c:30
FF_LEVEL_UNKNOWN
#define FF_LEVEL_UNKNOWN
Definition: avcodec.h:1985
VPCC::chroma_subsampling
int chroma_subsampling
Definition: vpcc.h:39
sample_rate
sample_rate
Definition: ffmpeg_filter.c:170
AVCodecParameters::color_primaries
enum AVColorPrimaries color_primaries
Definition: codec_par.h:147
av_pix_fmt_get_chroma_sub_sample
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
Definition: pixdesc.c:2601
AVRational::num
int num
Numerator.
Definition: rational.h:59
vpcc.h
AVCodecParameters::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: codec_par.h:148
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
s
#define s(width, name)
Definition: cbs_vp9.c:257
FF_PROFILE_VP9_3
#define FF_PROFILE_VP9_3
Definition: avcodec.h:1944
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:126
FF_PROFILE_UNKNOWN
#define FF_PROFILE_UNKNOWN
Definition: avcodec.h:1859
color_range
color_range
Definition: vf_selectivecolor.c:44
FF_PROFILE_VP9_2
#define FF_PROFILE_VP9_2
Definition: avcodec.h:1943
AVFormatContext
Format I/O context.
Definition: avformat.h:1232
NULL
#define NULL
Definition: coverity.c:32
VPCC::bitdepth
int bitdepth
Definition: vpcc.h:38
AVCHROMA_LOC_LEFT
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition: pixfmt.h:607
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:203
AVCodecParameters::level
int level
Definition: codec_par.h:121
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
ff_isom_write_vpcc
int ff_isom_write_vpcc(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par)
Writes VP codec configuration to the provided AVIOContext.
Definition: vpcc.c:149
get_vpx_video_full_range_flag
static int get_vpx_video_full_range_flag(enum AVColorRange color_range)
Definition: vpcc.c:65
VPX_SUBSAMPLING_420_COLLOCATED_WITH_LUMA
@ VPX_SUBSAMPLING_420_COLLOCATED_WITH_LUMA
Definition: vpcc.c:29
AVCodecParameters::profile
int profile
Codec-specific bitstream restrictions that the stream conforms to.
Definition: codec_par.h:120
AVChromaLocation
AVChromaLocation
Location of chroma samples.
Definition: pixfmt.h:605
AVCodecParameters::height
int height
Definition: codec_par.h:127
VPX_SUBSAMPLING_420_VERTICAL
@ VPX_SUBSAMPLING_420_VERTICAL
Definition: vpcc.c:28
AVCodecParameters::color_range
enum AVColorRange color_range
Video only.
Definition: codec_par.h:146
get_bit_depth
static int get_bit_depth(AVFormatContext *s, enum AVPixelFormat pixel_format)
Definition: vpcc.c:54
ret
ret
Definition: filter_design.txt:187
pixfmt.h
FF_PROFILE_VP9_1
#define FF_PROFILE_VP9_1
Definition: avcodec.h:1942
VPCC::level
int level
Definition: vpcc.h:37
AVCodecParameters::chroma_location
enum AVChromaLocation chroma_location
Definition: codec_par.h:150
VPCC
Definition: vpcc.h:35
AVRational::den
int den
Denominator.
Definition: rational.h:60
desc
const char * desc
Definition: libsvtav1.c:79
AVCodecParameters::format
int format
Definition: codec_par.h:84
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
avio_wb16
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:461
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
VPX_SUBSAMPLING_444
@ VPX_SUBSAMPLING_444
Definition: vpcc.c:31
VPCC::profile
int profile
Definition: vpcc.h:36
AVColorRange
AVColorRange
Visual content value range.
Definition: pixfmt.h:551
VPX_CHROMA_SUBSAMPLING
VPX_CHROMA_SUBSAMPLING
Definition: vpcc.c:26
get_vp9_level
static int get_vp9_level(AVCodecParameters *par, AVRational *frame_rate)
Definition: vpcc.c:71