FFmpeg
lcevc_metadata.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/common.h"
20 #include "libavutil/opt.h"
21 
22 #include "bsf.h"
23 #include "bsf_internal.h"
24 #include "cbs.h"
25 #include "cbs_bsf.h"
26 #include "cbs_lcevc.h"
27 #include "lcevc.h"
28 
29 typedef struct LCEVCMetadataContext {
31 
33 
39 
41 
43 
46 
49 {
52  LCEVCRawAdditionalInfo *ai = &ctx->ai;
53  LCEVCRawVUI *vui = &ai->vui;
54  int position, err;
55 
56  position = ff_cbs_lcevc_find_process_block(ctx->common.output, au,
58  &block);
59  if (position < 0)
60  return 0;
61 
62  memset(ai, 0, sizeof(*ai));
64 
65  if (ctx->overscan_appropriate_flag >= 0) {
67  vui->overscan_appropriate_flag = ctx->overscan_appropriate_flag;
68  }
69 
70  if (ctx->video_format >= 0) {
72  vui->video_format = ctx->video_format;
73  } else
74  vui->video_format = 5;
75 
76  if (ctx->video_full_range_flag >= 0) {
78  vui->video_full_range_flag = ctx->video_full_range_flag;
79  }
80 
81  if (ctx->colour_primaries >= 0) {
83  vui->colour_primaries = ctx->colour_primaries;
84  } else
85  vui->colour_primaries = 2;
86  if (ctx->transfer_characteristics >= 0) {
88  vui->transfer_characteristics = ctx->transfer_characteristics;
89  } else
90  vui->transfer_characteristics = 2;
91  if (ctx->matrix_coefficients >= 0) {
93  vui->matrix_coefficients = ctx->matrix_coefficients;
94  } else
95  vui->matrix_coefficients = 2;
96 
97  if (ctx->chroma_sample_loc_type >= 0) {
99  vui->chroma_sample_loc_type_top_field = ctx->chroma_sample_loc_type;
100  vui->chroma_sample_loc_type_top_field = ctx->chroma_sample_loc_type;
101  }
102 
103  err = ff_cbs_lcevc_add_process_block(ctx->common.output, au, position,
105  ai, NULL);
106  if (err < 0)
107  return err;
108 
109  return 0;
110 }
111 
114 {
116  int err;
117 
118  if (ctx->overscan_appropriate_flag >= 0 || ctx->video_format >= 0 ||
119  ctx->video_full_range_flag >= 0 || ctx->colour_primaries >= 0 ||
120  ctx->transfer_characteristics >= 0 || ctx->matrix_coefficients >= 0 ||
121  ctx->chroma_sample_loc_type >= 0) {
122  err = lcevc_metadata_handle_vui(bsf, au);
123  if (err < 0)
124  return err;
125  }
126 
127  if (ctx->delete_filler) {
128  for (int i = 0; i < au->nb_units; i++) {
129  if (au->units[i].type == LCEVC_NON_IDR_NUT ||
130  au->units[i].type == LCEVC_IDR_NUT) {
131  ff_cbs_lcevc_delete_process_block_type(ctx->common.output, au,
133  }
134  }
135  }
136 
137  return 0;
138 }
139 
142  .fragment_name = "access unit",
143  .unit_name = "NAL unit",
144  .update_fragment = &lcevc_metadata_update_fragment,
145 };
146 
148 {
150 }
151 
152 #define OFFSET(x) offsetof(LCEVCMetadataContext, x)
153 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
155  { "overscan_appropriate_flag", "Set VUI overscan appropriate flag",
156  OFFSET(overscan_appropriate_flag), AV_OPT_TYPE_BOOL,
157  { .i64 = -1 }, -1, 1, FLAGS },
158 
159  { "video_format", "Set video format (table E-2)",
160  OFFSET(video_format), AV_OPT_TYPE_INT,
161  { .i64 = -1 }, -1, 5, FLAGS},
162  { "video_full_range_flag", "Set video full range flag",
163  OFFSET(video_full_range_flag), AV_OPT_TYPE_BOOL,
164  { .i64 = -1 }, -1, 1, FLAGS },
165  { "colour_primaries", "Set colour primaries (table E-3)",
166  OFFSET(colour_primaries), AV_OPT_TYPE_INT,
167  { .i64 = -1 }, -1, 255, FLAGS },
168  { "transfer_characteristics", "Set transfer characteristics (table E-4)",
170  { .i64 = -1 }, -1, 255, FLAGS },
171  { "matrix_coefficients", "Set matrix coefficients (table E-5)",
172  OFFSET(matrix_coefficients), AV_OPT_TYPE_INT,
173  { .i64 = -1 }, -1, 255, FLAGS },
174 
175  { "chroma_sample_loc_type", "Set chroma sample location type (figure E-1)",
176  OFFSET(chroma_sample_loc_type), AV_OPT_TYPE_INT,
177  { .i64 = -1 }, -1, 5, FLAGS },
178 
179  { "delete_filler", "Delete all filler",
180  OFFSET(delete_filler), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS},
181 
182  { NULL }
183 };
184 
186  .class_name = "lcevc_metadata_bsf",
187  .item_name = av_default_item_name,
188  .option = lcevc_metadata_options,
189  .version = LIBAVUTIL_VERSION_INT,
190 };
191 
192 static const enum AVCodecID lcevc_metadata_codec_ids[] = {
194 };
195 
197  .p.name = "lcevc_metadata",
198  .p.codec_ids = lcevc_metadata_codec_ids,
199  .p.priv_class = &lcevc_metadata_class,
200  .priv_data_size = sizeof(LCEVCMetadataContext),
204 };
LCEVCRawVUI::overscan_appropriate_flag
uint8_t overscan_appropriate_flag
Definition: cbs_lcevc.h:138
LCEVCMetadataContext::video_full_range_flag
int video_full_range_flag
Definition: lcevc_metadata.c:35
bsf_internal.h
opt.h
FLAGS
#define FLAGS
Definition: lcevc_metadata.c:153
LCEVCMetadataContext::transfer_characteristics
int transfer_characteristics
Definition: lcevc_metadata.c:37
CBSBSFType::codec_id
enum AVCodecID codec_id
Definition: cbs_bsf.h:32
OFFSET
#define OFFSET(x)
Definition: lcevc_metadata.c:152
LCEVCMetadataContext::overscan_appropriate_flag
int overscan_appropriate_flag
Definition: lcevc_metadata.c:32
AVBitStreamFilter::name
const char * name
Definition: bsf.h:112
LCEVCMetadataContext::ai
LCEVCRawAdditionalInfo ai
Definition: lcevc_metadata.c:42
AVOption
AVOption.
Definition: opt.h:429
CBSBSFContext
Definition: cbs_bsf.h:53
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:81
ff_cbs_bsf_generic_close
av_cold void ff_cbs_bsf_generic_close(AVBSFContext *bsf)
Close a generic CBS BSF instance.
Definition: cbs_bsf.c:157
LCEVCRawVUI::video_format
uint8_t video_format
Definition: cbs_lcevc.h:140
LCEVCRawAdditionalInfo::additional_info_type
uint8_t additional_info_type
Definition: cbs_lcevc.h:161
LCEVCRawVUI::overscan_info_present_flag
uint8_t overscan_info_present_flag
Definition: cbs_lcevc.h:137
LCEVCRawVUI::matrix_coefficients
uint8_t matrix_coefficients
Definition: cbs_lcevc.h:145
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
LCEVCRawVUI
Definition: cbs_lcevc.h:132
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
bsf.h
cbs_lcevc.h
cbs_bsf.h
LCEVCMetadataContext
Definition: lcevc_metadata.c:29
CodedBitstreamFragment::units
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:175
lcevc_metadata_codec_ids
static enum AVCodecID lcevc_metadata_codec_ids[]
Definition: lcevc_metadata.c:192
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[]
Definition: vf_colorspace.c:177
lcevc_metadata_type
static const CBSBSFType lcevc_metadata_type
Definition: lcevc_metadata.c:140
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:129
lcevc_metadata_options
static const AVOption lcevc_metadata_options[]
Definition: lcevc_metadata.c:154
LCEVCRawVUI::chroma_loc_info_present_flag
uint8_t chroma_loc_info_present_flag
Definition: cbs_lcevc.h:146
LCEVCRawVUI::chroma_sample_loc_type_top_field
uint8_t chroma_sample_loc_type_top_field
Definition: cbs_lcevc.h:147
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
LCEVC_IDR_NUT
@ LCEVC_IDR_NUT
Definition: lcevc.h:61
LCEVCRawAdditionalInfo::vui
LCEVCRawVUI vui
Definition: cbs_lcevc.h:164
LCEVCMetadataContext::chroma_sample_loc_type
int chroma_sample_loc_type
Definition: lcevc_metadata.c:40
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
FFBitStreamFilter
Definition: bsf_internal.h:27
LCEVC_PAYLOAD_TYPE_ADDITIONAL_INFO
@ LCEVC_PAYLOAD_TYPE_ADDITIONAL_INFO
Definition: lcevc.h:75
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
lcevc_metadata_handle_vui
static int lcevc_metadata_handle_vui(AVBSFContext *bsf, CodedBitstreamFragment *au)
Definition: lcevc_metadata.c:47
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
LCEVCMetadataContext::common
CBSBSFContext common
Definition: lcevc_metadata.c:30
LCEVCRawVUI::transfer_characteristics
uint8_t transfer_characteristics
Definition: cbs_lcevc.h:144
FFBitStreamFilter::p
AVBitStreamFilter p
The public AVBitStreamFilter.
Definition: bsf_internal.h:31
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
CBSBSFType
Definition: cbs_bsf.h:31
LCEVCRawProcessBlock
Definition: cbs_lcevc.h:175
LCEVCMetadataContext::matrix_coefficients
int matrix_coefficients
Definition: lcevc_metadata.c:38
ff_cbs_lcevc_add_process_block
int ff_cbs_lcevc_add_process_block(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, int position, uint32_t payload_type, void *payload_data, void *payload_ref)
Add a process block to an access unit.
Definition: cbs_lcevc.c:613
LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG
@ LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG
Definition: lcevc.h:71
lcevc_metadata_init
static int lcevc_metadata_init(AVBSFContext *bsf)
Definition: lcevc_metadata.c:147
AV_CODEC_ID_LCEVC
@ AV_CODEC_ID_LCEVC
Definition: codec_id.h:615
ff_cbs_bsf_generic_init
av_cold int ff_cbs_bsf_generic_init(AVBSFContext *bsf, const CBSBSFType *type)
Initialise generic CBS BSF setup.
Definition: cbs_bsf.c:112
LCEVCRawVUI::colour_description_present_flag
uint8_t colour_description_present_flag
Definition: cbs_lcevc.h:142
LCEVCRawVUI::video_full_range_flag
uint8_t video_full_range_flag
Definition: cbs_lcevc.h:141
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
common.h
LCEVCMetadataContext::delete_filler
int delete_filler
Definition: lcevc_metadata.c:44
LCEVCMetadataContext::colour_primaries
int colour_primaries
Definition: lcevc_metadata.c:36
AVBSFContext::priv_data
void * priv_data
Opaque filter-specific private data.
Definition: bsf.h:83
ff_cbs_bsf_generic_filter
int ff_cbs_bsf_generic_filter(AVBSFContext *bsf, AVPacket *pkt)
Filter operation for CBS BSF.
Definition: cbs_bsf.c:63
AVClass::class_name
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:81
LCEVCRawVUI::colour_primaries
uint8_t colour_primaries
Definition: cbs_lcevc.h:143
LCEVCRawAdditionalInfo
Definition: cbs_lcevc.h:160
LCEVC_PAYLOAD_TYPE_FILLER
@ LCEVC_PAYLOAD_TYPE_FILLER
Definition: lcevc.h:76
LCEVCRawVUI::video_signal_type_present_flag
uint8_t video_signal_type_present_flag
Definition: cbs_lcevc.h:139
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
ff_cbs_lcevc_delete_process_block_type
void ff_cbs_lcevc_delete_process_block_type(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, uint32_t payload_type)
Delete all blocks with the given payload type from an access unit.
Definition: cbs_lcevc.c:717
lcevc.h
LCEVC_NON_IDR_NUT
@ LCEVC_NON_IDR_NUT
Definition: lcevc.h:60
ff_lcevc_metadata_bsf
const FFBitStreamFilter ff_lcevc_metadata_bsf
Definition: lcevc_metadata.c:196
LCEVC_ADDITIONAL_INFO_TYPE_VUI
@ LCEVC_ADDITIONAL_INFO_TYPE_VUI
Definition: lcevc.h:81
AVPacket
This structure stores compressed data.
Definition: packet.h:565
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
ff_cbs_lcevc_find_process_block
int ff_cbs_lcevc_find_process_block(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, uint32_t payload_type, LCEVCRawProcessBlock **iter)
Iterate over blocks with the given payload type in an access unit.
Definition: cbs_lcevc.c:665
lcevc_metadata_class
static const AVClass lcevc_metadata_class
Definition: lcevc_metadata.c:185
LCEVCMetadataContext::video_format
int video_format
Definition: lcevc_metadata.c:34
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
CodedBitstreamFragment::nb_units
int nb_units
Number of units in this fragment.
Definition: cbs.h:160
lcevc_metadata_update_fragment
static int lcevc_metadata_update_fragment(AVBSFContext *bsf, AVPacket *pkt, CodedBitstreamFragment *au)
Definition: lcevc_metadata.c:112