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 "libavcodec/defs.h"
25 #include "libavcodec/get_bits.h"
26 #include "vpcc.h"
27 
28 #define VP9_SYNCCODE 0x498342
29 
31 {
36 };
37 
39  enum AVPixelFormat pixel_format,
40  enum AVChromaLocation chroma_location)
41 {
42  int chroma_w, chroma_h;
43  if (av_pix_fmt_get_chroma_sub_sample(pixel_format, &chroma_w, &chroma_h) == 0) {
44  if (chroma_w == 1 && chroma_h == 1) {
45  return (chroma_location == AVCHROMA_LOC_LEFT)
48  } else if (chroma_w == 1 && chroma_h == 0) {
49  return VPX_SUBSAMPLING_422;
50  } else if (chroma_w == 0 && chroma_h == 0) {
51  return VPX_SUBSAMPLING_444;
52  }
53  }
54  av_log(s, AV_LOG_ERROR, "Unsupported pixel format (%d)\n", pixel_format);
55  return -1;
56 }
57 
58 static int get_bit_depth(AVFormatContext *s, enum AVPixelFormat pixel_format)
59 {
60  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pixel_format);
61  if (desc == NULL) {
62  av_log(s, AV_LOG_ERROR, "Unsupported pixel format (%d)\n",
63  pixel_format);
64  return -1;
65  }
66  return desc->comp[0].depth;
67 }
68 
70 {
71  return color_range == AVCOL_RANGE_JPEG;
72 }
73 
74 // Find approximate VP9 level based on the Luma's Sample rate and Picture size.
75 static int get_vp9_level(AVCodecParameters *par, AVRational *frame_rate) {
76  int picture_size = par->width * par->height;
77  int64_t sample_rate;
78 
79  // All decisions will be based on picture_size, if frame rate is missing/invalid
80  if (!frame_rate || !frame_rate->den)
81  sample_rate = 0;
82  else
83  sample_rate = ((int64_t)picture_size * frame_rate->num) / frame_rate->den;
84 
85  if (picture_size <= 0) {
86  return 0;
87  } else if (sample_rate <= 829440 && picture_size <= 36864) {
88  return 10;
89  } else if (sample_rate <= 2764800 && picture_size <= 73728) {
90  return 11;
91  } else if (sample_rate <= 4608000 && picture_size <= 122880) {
92  return 20;
93  } else if (sample_rate <= 9216000 && picture_size <= 245760) {
94  return 21;
95  } else if (sample_rate <= 20736000 && picture_size <= 552960) {
96  return 30;
97  } else if (sample_rate <= 36864000 && picture_size <= 983040) {
98  return 31;
99  } else if (sample_rate <= 83558400 && picture_size <= 2228224) {
100  return 40;
101  } else if (sample_rate <= 160432128 && picture_size <= 2228224) {
102  return 41;
103  } else if (sample_rate <= 311951360 && picture_size <= 8912896) {
104  return 50;
105  } else if (sample_rate <= 588251136 && picture_size <= 8912896) {
106  return 51;
107  } else if (sample_rate <= 1176502272 && picture_size <= 8912896) {
108  return 52;
109  } else if (sample_rate <= 1176502272 && picture_size <= 35651584) {
110  return 60;
111  } else if (sample_rate <= 2353004544 && picture_size <= 35651584) {
112  return 61;
113  } else if (sample_rate <= 4706009088 && picture_size <= 35651584) {
114  return 62;
115  } else {
116  return 0;
117  }
118 }
119 
120 static void parse_bitstream(GetBitContext *gb, int *profile, int *bit_depth) {
121  int keyframe, invisible;
122 
123  if (get_bits(gb, 2) != 0x2) // frame marker
124  return;
125  *profile = get_bits1(gb);
126  *profile |= get_bits1(gb) << 1;
127  if (*profile == 3)
128  *profile += get_bits1(gb);
129 
130  if (get_bits1(gb))
131  return;
132 
133  keyframe = !get_bits1(gb);
134  invisible = !get_bits1(gb);
135  get_bits1(gb);
136 
137  if (keyframe) {
138  if (get_bits(gb, 24) != VP9_SYNCCODE)
139  return;
140  } else {
141  int intraonly = invisible ? get_bits1(gb) : 0;
142  if (!intraonly || get_bits(gb, 24) != VP9_SYNCCODE)
143  return;
144  if (*profile < 1) {
145  *bit_depth = 8;
146  return;
147  }
148  }
149 
150  *bit_depth = *profile <= 1 ? 8 : 10 + get_bits1(gb) * 2;
151 }
152 
154  const uint8_t *data, int len,
155  AVRational *frame_rate, VPCC *vpcc)
156 {
157  int profile = par->profile;
158  int level = par->level == AV_LEVEL_UNKNOWN ?
159  get_vp9_level(par, frame_rate) : par->level;
160  int bit_depth = get_bit_depth(s, par->format);
161  int vpx_chroma_subsampling =
163  int vpx_video_full_range_flag =
165 
166  if (bit_depth < 0 || vpx_chroma_subsampling < 0)
167  return AVERROR_INVALIDDATA;
168 
169  if (len && (profile == AV_PROFILE_UNKNOWN || !bit_depth)) {
170  GetBitContext gb;
171 
172  int ret = init_get_bits8(&gb, data, len);
173  if (ret < 0)
174  return ret;
175 
177  }
178 
180  if (vpx_chroma_subsampling == VPX_SUBSAMPLING_420_VERTICAL ||
181  vpx_chroma_subsampling == VPX_SUBSAMPLING_420_COLLOCATED_WITH_LUMA) {
183  } else {
185  }
186  }
187 
189  av_log(s, AV_LOG_WARNING, "VP9 profile and/or bit depth not set or could not be derived\n");
190 
191  vpcc->profile = profile;
192  vpcc->level = level;
193  vpcc->bitdepth = bit_depth;
194  vpcc->chroma_subsampling = vpx_chroma_subsampling;
195  vpcc->full_range_flag = vpx_video_full_range_flag;
196 
197  return 0;
198 }
199 
201  const uint8_t *data, int len,
202  AVCodecParameters *par)
203 {
204  VPCC vpcc;
205  int ret;
206 
207  ret = ff_isom_get_vpcc_features(s, par, data, len, NULL, &vpcc);
208  if (ret < 0)
209  return ret;
210 
211  avio_w8(pb, 1); /* version */
212  avio_wb24(pb, 0); /* flags */
213  avio_w8(pb, vpcc.profile);
214  avio_w8(pb, vpcc.level);
215  avio_w8(pb, (vpcc.bitdepth << 4) | (vpcc.chroma_subsampling << 1) | vpcc.full_range_flag);
216  avio_w8(pb, par->color_primaries);
217  avio_w8(pb, par->color_trc);
218  avio_w8(pb, par->color_space);
219 
220  // vp9 does not have codec initialization data.
221  avio_wb16(pb, 0);
222  return 0;
223 }
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
level
uint8_t level
Definition: svq3.c:205
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
AVCodecParameters::color_space
enum AVColorSpace color_space
Definition: codec_par.h:169
get_vpx_chroma_subsampling
static int get_vpx_chroma_subsampling(AVFormatContext *s, enum AVPixelFormat pixel_format, enum AVChromaLocation chroma_location)
Definition: vpcc.c:38
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3170
VPCC::full_range_flag
int full_range_flag
Definition: vpcc.h:40
int64_t
long long int64_t
Definition: coverity.c:34
AV_PROFILE_VP9_1
#define AV_PROFILE_VP9_1
Definition: defs.h:155
pixdesc.h
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:717
data
const char data[16]
Definition: mxf.c:149
VPX_SUBSAMPLING_422
@ VPX_SUBSAMPLING_422
Definition: vpcc.c:34
VPCC::chroma_subsampling
int chroma_subsampling
Definition: vpcc.h:39
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
AVCodecParameters::color_primaries
enum AVColorPrimaries color_primaries
Definition: codec_par.h:167
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
parse_bitstream
static void parse_bitstream(GetBitContext *gb, int *profile, int *bit_depth)
Definition: vpcc.c:120
GetBitContext
Definition: get_bits.h:108
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:3198
AV_PROFILE_VP9_3
#define AV_PROFILE_VP9_3
Definition: defs.h:157
AVRational::num
int num
Numerator.
Definition: rational.h:59
vpcc.h
AVCodecParameters::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: codec_par.h:168
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:545
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition: defs.h:65
VP9_SYNCCODE
#define VP9_SYNCCODE
Definition: vpcc.c:28
s
#define s(width, name)
Definition: cbs_vp9.c:198
ff_isom_get_vpcc_features
int ff_isom_get_vpcc_features(AVFormatContext *s, AVCodecParameters *par, const uint8_t *data, int len, AVRational *frame_rate, VPCC *vpcc)
Definition: vpcc.c:153
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
get_bits.h
color_range
color_range
Definition: vf_selectivecolor.c:43
ff_isom_write_vpcc
int ff_isom_write_vpcc(AVFormatContext *s, AVIOContext *pb, const uint8_t *data, int len, AVCodecParameters *par)
Writes VP codec configuration to the provided AVIOContext.
Definition: vpcc.c:200
AVFormatContext
Format I/O context.
Definition: avformat.h:1300
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:738
AV_LEVEL_UNKNOWN
#define AV_LEVEL_UNKNOWN
Definition: defs.h:198
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:388
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:179
AVCodecParameters::level
int level
Definition: codec_par.h:129
VPX_CHROMA_SUBSAMPLING
VPX_CHROMA_SUBSAMPLING
Definition: videotoolbox_vp9.c:39
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
get_vpx_video_full_range_flag
static int get_vpx_video_full_range_flag(enum AVColorRange color_range)
Definition: vpcc.c:69
VPX_SUBSAMPLING_420_COLLOCATED_WITH_LUMA
@ VPX_SUBSAMPLING_420_COLLOCATED_WITH_LUMA
Definition: vpcc.c:33
AVCodecParameters::profile
int profile
Codec-specific bitstream restrictions that the stream conforms to.
Definition: codec_par.h:128
AVChromaLocation
AVChromaLocation
Location of chroma samples.
Definition: pixfmt.h:736
AVCodecParameters::height
int height
Definition: codec_par.h:135
VPX_SUBSAMPLING_420_VERTICAL
@ VPX_SUBSAMPLING_420_VERTICAL
Definition: vpcc.c:32
AVCodecParameters::color_range
enum AVColorRange color_range
Video only.
Definition: codec_par.h:166
len
int len
Definition: vorbis_enc_data.h:426
profile
int profile
Definition: mxfenc.c:2228
AV_PROFILE_VP9_2
#define AV_PROFILE_VP9_2
Definition: defs.h:156
get_bit_depth
static int get_bit_depth(AVFormatContext *s, enum AVPixelFormat pixel_format)
Definition: vpcc.c:58
ret
ret
Definition: filter_design.txt:187
pixfmt.h
VPCC::level
int level
Definition: vpcc.h:37
AVCodecParameters::chroma_location
enum AVChromaLocation chroma_location
Definition: codec_par.h:170
VPCC
Definition: vpcc.h:35
AVRational::den
int den
Denominator.
Definition: rational.h:60
defs.h
AV_PROFILE_VP9_0
#define AV_PROFILE_VP9_0
Definition: defs.h:154
desc
const char * desc
Definition: libsvtav1.c:79
AVCodecParameters::format
int format
Definition: codec_par.h:92
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
avio_wb24
void avio_wb24(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:455
avio_wb16
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:443
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
VPX_SUBSAMPLING_444
@ VPX_SUBSAMPLING_444
Definition: vpcc.c:35
VPCC::profile
int profile
Definition: vpcc.h:36
AVColorRange
AVColorRange
Visual content value range.
Definition: pixfmt.h:682
get_vp9_level
static int get_vp9_level(AVCodecParameters *par, AVRational *frame_rate)
Definition: vpcc.c:75