FFmpeg
libavcodec
cbs_bsf.h
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
#ifndef AVCODEC_CBS_BSF_H
20
#define AVCODEC_CBS_BSF_H
21
22
#include "
libavutil/log.h
"
23
#include "
libavutil/opt.h
"
24
25
#include "
bsf.h
"
26
#include "
codec_id.h
"
27
#include "
cbs.h
"
28
#include "
packet.h
"
29
30
31
typedef
struct
CBSBSFType
{
32
enum
AVCodecID
codec_id
;
33
34
// Name of a frame fragment in this codec (e.g. "access unit",
35
// "temporal unit").
36
const
char
*
fragment_name
;
37
38
// Name of a unit for this BSF, for use in error messages (e.g.
39
// "NAL unit", "OBU").
40
const
char
*
unit_name
;
41
42
// Update the content of a fragment with whatever metadata changes
43
// are desired. The associated AVPacket is provided so that any side
44
// data associated with the fragment can be inspected or edited. If
45
// pkt is NULL, then an extradata header fragment is being updated.
46
int (*
update_fragment
)(
AVBSFContext
*bsf,
AVPacket
*
pkt
,
47
CodedBitstreamFragment
*frag);
48
}
CBSBSFType
;
49
50
// Common structure for all generic CBS BSF users. An instance of this
51
// structure must be the first member of the BSF private context (to be
52
// pointed to by AVBSFContext.priv_data).
53
typedef
struct
CBSBSFContext
{
54
const
AVClass
*
class
;
55
const
CBSBSFType
*
type
;
56
57
CodedBitstreamContext
*
input
;
58
CodedBitstreamContext
*
output
;
59
CodedBitstreamFragment
fragment
;
60
}
CBSBSFContext
;
61
62
/**
63
* Initialise generic CBS BSF setup.
64
*
65
* Creates the input and output CBS instances, and applies the filter to
66
* the extradata on the input codecpar if any is present.
67
*
68
* Since it calls the update_fragment() function immediately to deal with
69
* extradata, this should be called after any codec-specific setup is done
70
* (probably at the end of the FFBitStreamFilter.init function).
71
*/
72
int
ff_cbs_bsf_generic_init
(
AVBSFContext
*bsf,
const
CBSBSFType
*
type
);
73
74
/**
75
* Close a generic CBS BSF instance.
76
*
77
* If no other deinitialisation is required then this function can be used
78
* directly as FFBitStreamFilter.close.
79
*/
80
void
ff_cbs_bsf_generic_close
(
AVBSFContext
*bsf);
81
82
/**
83
* Filter operation for CBS BSF.
84
*
85
* Reads the input packet into a CBS fragment, calls update_fragment() on
86
* it, then writes the result to an output packet. If the input packet
87
* has AV_PKT_DATA_NEW_EXTRADATA side-data associated with it then it does
88
* the same thing to that new extradata to form the output side-data first.
89
*
90
* If the BSF does not do anything else then this function can be used
91
* directly as FFBitStreamFilter.filter.
92
*/
93
int
ff_cbs_bsf_generic_filter
(
AVBSFContext
*bsf,
AVPacket
*
pkt
);
94
95
96
// Options for element manipulation.
97
enum
{
98
// Pass this element through unchanged.
99
BSF_ELEMENT_PASS
,
100
// Insert this element, replacing any existing instances of it.
101
// Associated values may be provided explicitly (as additional options)
102
// or implicitly (either as side data or deduced from other parts of
103
// the stream).
104
BSF_ELEMENT_INSERT
,
105
// Remove this element if it appears in the stream.
106
BSF_ELEMENT_REMOVE
,
107
// Extract this element to side data, so that further manipulation
108
// can happen elsewhere.
109
BSF_ELEMENT_EXTRACT
,
110
};
111
112
#define BSF_ELEMENT_OPTIONS_PIR(name, help, field, opt_flags) \
113
{ name, help, OFFSET(field), AV_OPT_TYPE_INT, \
114
{ .i64 = BSF_ELEMENT_PASS }, \
115
BSF_ELEMENT_PASS, BSF_ELEMENT_REMOVE, opt_flags, .unit = name }, \
116
{ "pass", NULL, 0, AV_OPT_TYPE_CONST, \
117
{ .i64 = BSF_ELEMENT_PASS }, .flags = opt_flags, .unit = name }, \
118
{ "insert", NULL, 0, AV_OPT_TYPE_CONST, \
119
{ .i64 = BSF_ELEMENT_INSERT }, .flags = opt_flags, .unit = name }, \
120
{ "remove", NULL, 0, AV_OPT_TYPE_CONST, \
121
{ .i64 = BSF_ELEMENT_REMOVE }, .flags = opt_flags, .unit = name }
122
123
#define BSF_ELEMENT_OPTIONS_PIRE(name, help, field, opt_flags) \
124
{ name, help, OFFSET(field), AV_OPT_TYPE_INT, \
125
{ .i64 = BSF_ELEMENT_PASS }, \
126
BSF_ELEMENT_PASS, BSF_ELEMENT_EXTRACT, opt_flags, .unit = name }, \
127
{ "pass", NULL, 0, AV_OPT_TYPE_CONST, \
128
{ .i64 = BSF_ELEMENT_PASS }, .flags = opt_flags, .unit = name }, \
129
{ "insert", NULL, 0, AV_OPT_TYPE_CONST, \
130
{ .i64 = BSF_ELEMENT_INSERT }, .flags = opt_flags, .unit = name }, \
131
{ "remove", NULL, 0, AV_OPT_TYPE_CONST, \
132
{ .i64 = BSF_ELEMENT_REMOVE }, .flags = opt_flags, .unit = name }, \
133
{ "extract", NULL, 0, AV_OPT_TYPE_CONST, \
134
{ .i64 = BSF_ELEMENT_EXTRACT }, .flags = opt_flags, .unit = name } \
135
136
137
#endif
/* AVCODEC_CBS_BSF_H */
opt.h
CBSBSFType::codec_id
enum AVCodecID codec_id
Definition:
cbs_bsf.h:32
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition:
cbs.h:219
CBSBSFContext
Definition:
cbs_bsf.h:53
cbs.h
ff_cbs_bsf_generic_filter
int ff_cbs_bsf_generic_filter(AVBSFContext *bsf, AVPacket *pkt)
Filter operation for CBS BSF.
Definition:
cbs_bsf.c:61
CBSBSFContext::input
CodedBitstreamContext * input
Definition:
cbs_bsf.h:57
AVBSFContext
The bitstream filter state.
Definition:
bsf.h:68
CBSBSFType::fragment_name
const char * fragment_name
Definition:
cbs_bsf.h:36
bsf.h
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition:
writing_filters.txt:86
CBSBSFType::update_fragment
int(* update_fragment)(AVBSFContext *bsf, AVPacket *pkt, CodedBitstreamFragment *frag)
Definition:
cbs_bsf.h:46
pkt
AVPacket * pkt
Definition:
movenc.c:60
codec_id.h
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition:
cbs.h:122
BSF_ELEMENT_REMOVE
@ BSF_ELEMENT_REMOVE
Definition:
cbs_bsf.h:106
CBSBSFType::unit_name
const char * unit_name
Definition:
cbs_bsf.h:40
AVClass
Describe the class of an AVClass context structure.
Definition:
log.h:75
CBSBSFContext::fragment
CodedBitstreamFragment fragment
Definition:
cbs_bsf.h:59
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition:
codec_id.h:49
BSF_ELEMENT_INSERT
@ BSF_ELEMENT_INSERT
Definition:
cbs_bsf.h:104
CBSBSFType
Definition:
cbs_bsf.h:31
BSF_ELEMENT_EXTRACT
@ BSF_ELEMENT_EXTRACT
Definition:
cbs_bsf.h:109
ff_cbs_bsf_generic_init
int ff_cbs_bsf_generic_init(AVBSFContext *bsf, const CBSBSFType *type)
Initialise generic CBS BSF setup.
Definition:
cbs_bsf.c:110
log.h
packet.h
CBSBSFContext::type
const CBSBSFType * type
Definition:
cbs_bsf.h:55
ff_cbs_bsf_generic_close
void ff_cbs_bsf_generic_close(AVBSFContext *bsf)
Close a generic CBS BSF instance.
Definition:
cbs_bsf.c:155
AVPacket
This structure stores compressed data.
Definition:
packet.h:516
BSF_ELEMENT_PASS
@ BSF_ELEMENT_PASS
Definition:
cbs_bsf.h:99
CBSBSFContext::output
CodedBitstreamContext * output
Definition:
cbs_bsf.h:58
Generated on Sun Nov 24 2024 19:21:29 for FFmpeg by
1.8.17