FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/options.c
Date: 2024-03-28 14:59:00
Exec Total Coverage
Lines: 84 90 93.3%
Functions: 8 9 88.9%
Branches: 45 52 86.5%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2001 Fabrice Bellard
3 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
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 /**
23 * @file
24 * Options definition for AVCodecContext.
25 */
26
27 #include "config_components.h"
28
29 #include "avcodec.h"
30 #include "avcodec_internal.h"
31 #include "codec_internal.h"
32 #include "libavutil/avassert.h"
33 #include "libavutil/internal.h"
34 #include "libavutil/mem.h"
35 #include "libavutil/opt.h"
36 #include <string.h>
37
38 FF_DISABLE_DEPRECATION_WARNINGS
39 #include "options_table.h"
40 FF_ENABLE_DEPRECATION_WARNINGS
41
42 3719 static const char* context_to_name(void* ptr) {
43 3719 AVCodecContext *avc= ptr;
44
45
3/4
✓ Branch 0 taken 3719 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3713 times.
✓ Branch 3 taken 6 times.
3719 if (avc && avc->codec)
46 3713 return avc->codec->name;
47 else
48 6 return "NULL";
49 }
50
51 25095 static void *codec_child_next(void *obj, void *prev)
52 {
53 25095 AVCodecContext *s = obj;
54
6/8
✓ Branch 0 taken 20302 times.
✓ Branch 1 taken 4793 times.
✓ Branch 2 taken 20302 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4859 times.
✓ Branch 5 taken 15443 times.
✓ Branch 6 taken 4859 times.
✗ Branch 7 not taken.
25095 if (!prev && s->codec && s->codec->priv_class && s->priv_data)
55 4859 return s->priv_data;
56 20236 return NULL;
57 }
58
59 12859497 static const AVClass *codec_child_class_iterate(void **iter)
60 {
61 const AVCodec *c;
62 /* find next codec with priv options */
63
2/2
✓ Branch 1 taken 63360192 times.
✓ Branch 2 taken 91110 times.
63451302 while (c = av_codec_iterate(iter))
64
2/2
✓ Branch 0 taken 12768387 times.
✓ Branch 1 taken 50591805 times.
63360192 if (c->priv_class)
65 12768387 return c->priv_class;
66 91110 return NULL;
67 }
68
69 3719 static AVClassCategory get_category(void *ptr)
70 {
71 3719 AVCodecContext* avctx = ptr;
72
4/4
✓ Branch 0 taken 3713 times.
✓ Branch 1 taken 6 times.
✓ Branch 3 taken 3573 times.
✓ Branch 4 taken 140 times.
3719 if (avctx->codec && av_codec_is_decoder(avctx->codec))
73 3573 return AV_CLASS_CATEGORY_DECODER;
74 else
75 146 return AV_CLASS_CATEGORY_ENCODER;
76 }
77
78 static const AVClass av_codec_context_class = {
79 .class_name = "AVCodecContext",
80 .item_name = context_to_name,
81 .option = avcodec_options,
82 .version = LIBAVUTIL_VERSION_INT,
83 .log_level_offset_offset = offsetof(AVCodecContext, log_level_offset),
84 .child_next = codec_child_next,
85 .child_class_iterate = codec_child_class_iterate,
86 .category = AV_CLASS_CATEGORY_ENCODER,
87 .get_category = get_category,
88 };
89
90 57133 static int init_context_defaults(AVCodecContext *s, const AVCodec *codec)
91 {
92 57133 const FFCodec *const codec2 = ffcodec(codec);
93 57133 int flags=0;
94 57133 memset(s, 0, sizeof(AVCodecContext));
95
96 57133 s->av_class = &av_codec_context_class;
97
98
2/2
✓ Branch 0 taken 33701 times.
✓ Branch 1 taken 23432 times.
57133 s->codec_type = codec ? codec->type : AVMEDIA_TYPE_UNKNOWN;
99
2/2
✓ Branch 0 taken 33701 times.
✓ Branch 1 taken 23432 times.
57133 if (codec) {
100 33701 s->codec = codec;
101 33701 s->codec_id = codec->id;
102 }
103
104
2/2
✓ Branch 0 taken 4484 times.
✓ Branch 1 taken 52649 times.
57133 if(s->codec_type == AVMEDIA_TYPE_AUDIO)
105 4484 flags= AV_OPT_FLAG_AUDIO_PARAM;
106
2/2
✓ Branch 0 taken 29049 times.
✓ Branch 1 taken 23600 times.
52649 else if(s->codec_type == AVMEDIA_TYPE_VIDEO)
107 29049 flags= AV_OPT_FLAG_VIDEO_PARAM;
108
2/2
✓ Branch 0 taken 168 times.
✓ Branch 1 taken 23432 times.
23600 else if(s->codec_type == AVMEDIA_TYPE_SUBTITLE)
109 168 flags= AV_OPT_FLAG_SUBTITLE_PARAM;
110 57133 av_opt_set_defaults2(s, flags, flags);
111
112 57133 av_channel_layout_uninit(&s->ch_layout);
113
114 57133 s->time_base = (AVRational){0,1};
115 57133 s->framerate = (AVRational){ 0, 1 };
116 57133 s->pkt_timebase = (AVRational){ 0, 1 };
117 57133 s->get_buffer2 = avcodec_default_get_buffer2;
118 57133 s->get_format = avcodec_default_get_format;
119 57133 s->get_encode_buffer = avcodec_default_get_encode_buffer;
120 57133 s->execute = avcodec_default_execute;
121 57133 s->execute2 = avcodec_default_execute2;
122 57133 s->sample_aspect_ratio = (AVRational){0,1};
123 57133 s->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
124 57133 s->pix_fmt = AV_PIX_FMT_NONE;
125 57133 s->sw_pix_fmt = AV_PIX_FMT_NONE;
126 57133 s->sample_fmt = AV_SAMPLE_FMT_NONE;
127
128
4/4
✓ Branch 0 taken 33701 times.
✓ Branch 1 taken 23432 times.
✓ Branch 2 taken 15063 times.
✓ Branch 3 taken 18638 times.
57133 if(codec && codec2->priv_data_size){
129 15063 s->priv_data = av_mallocz(codec2->priv_data_size);
130
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15063 times.
15063 if (!s->priv_data)
131 return AVERROR(ENOMEM);
132
2/2
✓ Branch 0 taken 4825 times.
✓ Branch 1 taken 10238 times.
15063 if(codec->priv_class){
133 4825 *(const AVClass**)s->priv_data = codec->priv_class;
134 4825 av_opt_set_defaults(s->priv_data);
135 }
136 }
137
4/4
✓ Branch 0 taken 33701 times.
✓ Branch 1 taken 23432 times.
✓ Branch 2 taken 169 times.
✓ Branch 3 taken 33532 times.
57133 if (codec && codec2->defaults) {
138 int ret;
139 169 const FFCodecDefault *d = codec2->defaults;
140
2/2
✓ Branch 0 taken 169 times.
✓ Branch 1 taken 169 times.
338 while (d->key) {
141 169 ret = av_opt_set(s, d->key, d->value, 0);
142
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 169 times.
169 av_assert0(ret >= 0);
143 169 d++;
144 }
145 }
146 57133 return 0;
147 }
148
149 57133 AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
150 {
151 57133 AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
152
153
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 57133 times.
57133 if (!avctx)
154 return NULL;
155
156
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 57133 times.
57133 if (init_context_defaults(avctx, codec) < 0) {
157 av_free(avctx);
158 return NULL;
159 }
160
161 57133 return avctx;
162 }
163
164 72874 void avcodec_free_context(AVCodecContext **pavctx)
165 {
166 72874 AVCodecContext *avctx = *pavctx;
167
168
2/2
✓ Branch 0 taken 15741 times.
✓ Branch 1 taken 57133 times.
72874 if (!avctx)
169 15741 return;
170
171 57133 ff_codec_close(avctx);
172
173 57133 av_freep(&avctx->extradata);
174 57133 av_freep(&avctx->subtitle_header);
175 57133 av_freep(&avctx->intra_matrix);
176 57133 av_freep(&avctx->chroma_intra_matrix);
177 57133 av_freep(&avctx->inter_matrix);
178 57133 av_freep(&avctx->rc_override);
179 57133 av_channel_layout_uninit(&avctx->ch_layout);
180 57133 av_frame_side_data_free(
181 &avctx->decoded_side_data, &avctx->nb_decoded_side_data);
182
183 57133 av_freep(pavctx);
184 }
185
186 119107 const AVClass *avcodec_get_class(void)
187 {
188 119107 return &av_codec_context_class;
189 }
190
191 #define SROFFSET(x) offsetof(AVSubtitleRect,x)
192
193 static const AVOption subtitle_rect_options[]={
194 {"x", "", SROFFSET(x), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
195 {"y", "", SROFFSET(y), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
196 {"w", "", SROFFSET(w), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
197 {"h", "", SROFFSET(h), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
198 {"type", "", SROFFSET(type), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
199 {"flags", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0, .unit = "flags"},
200 {"forced", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0},
201 {NULL},
202 };
203
204 static const AVClass av_subtitle_rect_class = {
205 .class_name = "AVSubtitleRect",
206 .item_name = NULL,
207 .option = subtitle_rect_options,
208 .version = LIBAVUTIL_VERSION_INT,
209 };
210
211 const AVClass *avcodec_get_subtitle_rect_class(void)
212 {
213 return &av_subtitle_rect_class;
214 }
215