FFmpeg  4.4
vp9_metadata_bsf.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "libavutil/avstring.h"
20 #include "libavutil/common.h"
21 #include "libavutil/opt.h"
22 
23 #include "bsf.h"
24 #include "cbs.h"
25 #include "cbs_bsf.h"
26 #include "cbs_vp9.h"
27 
28 typedef struct VP9MetadataContext {
30 
33 
36 
37 
40 {
42  int i;
43 
44  for (i = 0; i < frag->nb_units; i++) {
45  VP9RawFrame *frame = frag->units[i].content;
46  VP9RawFrameHeader *header = &frame->header;
47  int profile = (header->profile_high_bit << 1) + header->profile_low_bit;
48 
49  if (header->frame_type == VP9_KEY_FRAME ||
50  header->intra_only && profile > 0) {
51  if (ctx->color_space >= 0) {
52  if (!(profile & 1) && ctx->color_space == VP9_CS_RGB) {
53  if (!(ctx->color_warnings & 2)) {
54  av_log(bsf, AV_LOG_WARNING, "Warning: RGB "
55  "incompatible with profiles 0 and 2.\n");
56  ctx->color_warnings |= 2;
57  }
58  } else
59  header->color_space = ctx->color_space;
60  }
61 
62  if (ctx->color_range >= 0)
63  header->color_range = ctx->color_range;
64  if (header->color_space == VP9_CS_RGB) {
65  if (!(ctx->color_warnings & 1) && !header->color_range) {
66  av_log(bsf, AV_LOG_WARNING, "Warning: Color space RGB "
67  "implicitly sets color range to PC range.\n");
68  ctx->color_warnings |= 1;
69  }
70  header->color_range = 1;
71  }
72  } else if (!(ctx->color_warnings & 4) && header->intra_only && !profile &&
73  ctx->color_space >= 0 && ctx->color_space != VP9_CS_BT_601) {
74  av_log(bsf, AV_LOG_WARNING, "Warning: Intra-only frames in "
75  "profile 0 are automatically BT.601.\n");
76  ctx->color_warnings |= 4;
77  }
78  }
79 
80  return 0;
81 }
82 
83 static const CBSBSFType vp9_metadata_type = {
85  .fragment_name = "superframe",
86  .unit_name = "frame",
87  .update_fragment = &vp9_metadata_update_fragment,
88 };
89 
91 {
93 }
94 
95 #define OFFSET(x) offsetof(VP9MetadataContext, x)
96 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
97 static const AVOption vp9_metadata_options[] = {
98  { "color_space", "Set colour space (section 7.2.2)",
99  OFFSET(color_space), AV_OPT_TYPE_INT,
100  { .i64 = -1 }, -1, VP9_CS_RGB, FLAGS, "cs" },
101  { "unknown", "Unknown/unspecified", 0, AV_OPT_TYPE_CONST,
102  { .i64 = VP9_CS_UNKNOWN }, .flags = FLAGS, .unit = "cs" },
103  { "bt601", "ITU-R BT.601-7", 0, AV_OPT_TYPE_CONST,
104  { .i64 = VP9_CS_BT_601 }, .flags = FLAGS, .unit = "cs" },
105  { "bt709", "ITU-R BT.709-6", 0, AV_OPT_TYPE_CONST,
106  { .i64 = VP9_CS_BT_709 }, .flags = FLAGS, .unit = "cs" },
107  { "smpte170", "SMPTE-170", 0, AV_OPT_TYPE_CONST,
108  { .i64 = VP9_CS_SMPTE_170 }, .flags = FLAGS, .unit = "cs" },
109  { "smpte240", "SMPTE-240", 0, AV_OPT_TYPE_CONST,
110  { .i64 = VP9_CS_SMPTE_240 }, .flags = FLAGS, .unit = "cs" },
111  { "bt2020", "ITU-R BT.2020-2", 0, AV_OPT_TYPE_CONST,
112  { .i64 = VP9_CS_BT_2020 }, .flags = FLAGS, .unit = "cs" },
113  { "rgb", "sRGB / IEC 61966-2-1", 0, AV_OPT_TYPE_CONST,
114  { .i64 = VP9_CS_RGB }, .flags = FLAGS, .unit = "cs" },
115 
116  { "color_range", "Set colour range (section 7.2.2)",
118  { .i64 = -1 }, -1, 1, FLAGS, "cr" },
119  { "tv", "TV (limited) range", 0, AV_OPT_TYPE_CONST,
120  { .i64 = 0 }, .flags = FLAGS, .unit = "cr" },
121  { "pc", "PC (full) range", 0, AV_OPT_TYPE_CONST,
122  { .i64 = 1 }, .flags = FLAGS, .unit = "cr" },
123 
124  { NULL }
125 };
126 
127 static const AVClass vp9_metadata_class = {
128  .class_name = "vp9_metadata_bsf",
129  .item_name = av_default_item_name,
130  .option = vp9_metadata_options,
131  .version = LIBAVUTIL_VERSION_INT,
132 };
133 
134 static const enum AVCodecID vp9_metadata_codec_ids[] = {
136 };
137 
139  .name = "vp9_metadata",
140  .priv_data_size = sizeof(VP9MetadataContext),
141  .priv_class = &vp9_metadata_class,
143  .close = &ff_cbs_bsf_generic_close,
146 };
static enum AVCodecID codec_ids[]
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
int ff_cbs_bsf_generic_filter(AVBSFContext *bsf, AVPacket *pkt)
Filter operation for CBS BSF.
Definition: cbs_bsf.c:63
int ff_cbs_bsf_generic_init(AVBSFContext *bsf, const CBSBSFType *type)
Initialise generic CBS BSF setup.
Definition: cbs_bsf.c:112
void ff_cbs_bsf_generic_close(AVBSFContext *bsf)
Close a generic CBS BSF instance.
Definition: cbs_bsf.c:152
@ VP9_CS_RGB
Definition: cbs_vp9.h:64
@ VP9_CS_BT_2020
Definition: cbs_vp9.h:62
@ VP9_CS_UNKNOWN
Definition: cbs_vp9.h:57
@ VP9_CS_BT_709
Definition: cbs_vp9.h:59
@ VP9_CS_BT_601
Definition: cbs_vp9.h:58
@ VP9_CS_SMPTE_240
Definition: cbs_vp9.h:61
@ VP9_CS_SMPTE_170
Definition: cbs_vp9.h:60
@ VP9_KEY_FRAME
Definition: cbs_vp9.h:44
static av_always_inline void filter(int16_t *output, ptrdiff_t out_stride, const int16_t *low, ptrdiff_t low_stride, const int16_t *high, ptrdiff_t high_stride, int len, int clip)
Definition: cfhddsp.c:27
common internal and external API header
#define NULL
Definition: coverity.c:32
static AVFrame * frame
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
@ AV_OPT_TYPE_INT
Definition: opt.h:225
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:46
@ AV_CODEC_ID_NONE
Definition: codec_id.h:47
@ AV_CODEC_ID_VP9
Definition: codec_id.h:217
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:200
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
int i
Definition: input.c:407
AVOptions.
mfxU16 profile
Definition: qsvenc.c:45
static const uint8_t header[24]
Definition: sdr2.c:67
The bitstream filter state.
Definition: bsf.h:49
void * priv_data
Opaque filter-specific private data.
Definition: bsf.h:70
const char * name
Definition: bsf.h:99
Describe the class of an AVClass context structure.
Definition: log.h:67
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
AVOption.
Definition: opt.h:248
This structure stores compressed data.
Definition: packet.h:346
enum AVCodecID codec_id
Definition: cbs_bsf.h:26
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:118
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:164
int nb_units
Number of units in this fragment.
Definition: cbs.h:149
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:103
CBSBSFContext common
#define av_log(a,...)
AVPacket * pkt
Definition: movenc.c:59
AVFormatContext * ctx
Definition: movenc.c:48
if(ret< 0)
Definition: vf_mcdeint.c:282
color_range
static const AVClass vp9_metadata_class
static enum AVCodecID vp9_metadata_codec_ids[]
static int vp9_metadata_update_fragment(AVBSFContext *bsf, AVPacket *pkt, CodedBitstreamFragment *frag)
#define FLAGS
const AVBitStreamFilter ff_vp9_metadata_bsf
static const AVOption vp9_metadata_options[]
#define OFFSET(x)
static const CBSBSFType vp9_metadata_type
static int vp9_metadata_init(AVBSFContext *bsf)