xref: /third_party/ffmpeg/libavcodec/bsf.c (revision cabdff1a)
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 <string.h>
20
21#include "config_components.h"
22
23#include "libavutil/avassert.h"
24#include "libavutil/log.h"
25#include "libavutil/mem.h"
26#include "libavutil/opt.h"
27#include "libavutil/avstring.h"
28#include "libavutil/bprint.h"
29
30#include "bsf.h"
31#include "bsf_internal.h"
32#include "codec_desc.h"
33#include "codec_par.h"
34
35#define IS_EMPTY(pkt) (!(pkt)->data && !(pkt)->side_data_elems)
36
37static av_always_inline const FFBitStreamFilter *ff_bsf(const AVBitStreamFilter *bsf)
38{
39    return (const FFBitStreamFilter*)bsf;
40}
41
42typedef struct FFBSFContext {
43    AVBSFContext pub;
44    AVPacket *buffer_pkt;
45    int eof;
46} FFBSFContext;
47
48static av_always_inline FFBSFContext *ffbsfcontext(AVBSFContext *ctx)
49{
50    return (FFBSFContext *)ctx;
51}
52
53void av_bsf_free(AVBSFContext **pctx)
54{
55    AVBSFContext *ctx;
56    FFBSFContext *bsfi;
57
58    if (!pctx || !*pctx)
59        return;
60    ctx  = *pctx;
61    bsfi = ffbsfcontext(ctx);
62
63    if (ctx->priv_data) {
64        if (ff_bsf(ctx->filter)->close)
65            ff_bsf(ctx->filter)->close(ctx);
66        if (ctx->filter->priv_class)
67            av_opt_free(ctx->priv_data);
68        av_freep(&ctx->priv_data);
69    }
70    av_packet_free(&bsfi->buffer_pkt);
71
72    avcodec_parameters_free(&ctx->par_in);
73    avcodec_parameters_free(&ctx->par_out);
74
75    av_freep(pctx);
76}
77
78static void *bsf_child_next(void *obj, void *prev)
79{
80    AVBSFContext *ctx = obj;
81    if (!prev && ctx->filter->priv_class)
82        return ctx->priv_data;
83    return NULL;
84}
85
86static const char *bsf_to_name(void *bsf)
87{
88    return ((AVBSFContext *)bsf)->filter->name;
89}
90
91static const AVClass bsf_class = {
92    .class_name       = "AVBSFContext",
93    .item_name        = bsf_to_name,
94    .version          = LIBAVUTIL_VERSION_INT,
95    .child_next       = bsf_child_next,
96    .child_class_iterate = ff_bsf_child_class_iterate,
97    .category         = AV_CLASS_CATEGORY_BITSTREAM_FILTER,
98};
99
100const AVClass *av_bsf_get_class(void)
101{
102    return &bsf_class;
103}
104
105int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **pctx)
106{
107    AVBSFContext *ctx;
108    FFBSFContext *bsfi;
109    int ret;
110
111    bsfi = av_mallocz(sizeof(*bsfi));
112    if (!bsfi)
113        return AVERROR(ENOMEM);
114    ctx  = &bsfi->pub;
115
116    ctx->av_class = &bsf_class;
117    ctx->filter   = filter;
118
119    ctx->par_in  = avcodec_parameters_alloc();
120    ctx->par_out = avcodec_parameters_alloc();
121    if (!ctx->par_in || !ctx->par_out) {
122        ret = AVERROR(ENOMEM);
123        goto fail;
124    }
125    /* allocate priv data and init private options */
126    if (ff_bsf(filter)->priv_data_size) {
127        ctx->priv_data = av_mallocz(ff_bsf(filter)->priv_data_size);
128        if (!ctx->priv_data) {
129            ret = AVERROR(ENOMEM);
130            goto fail;
131        }
132        if (filter->priv_class) {
133            *(const AVClass **)ctx->priv_data = filter->priv_class;
134            av_opt_set_defaults(ctx->priv_data);
135        }
136    }
137    bsfi->buffer_pkt = av_packet_alloc();
138    if (!bsfi->buffer_pkt) {
139        ret = AVERROR(ENOMEM);
140        goto fail;
141    }
142
143    *pctx = ctx;
144    return 0;
145fail:
146    av_bsf_free(&ctx);
147    return ret;
148}
149
150int av_bsf_init(AVBSFContext *ctx)
151{
152    int ret, i;
153
154    /* check that the codec is supported */
155    if (ctx->filter->codec_ids) {
156        for (i = 0; ctx->filter->codec_ids[i] != AV_CODEC_ID_NONE; i++)
157            if (ctx->par_in->codec_id == ctx->filter->codec_ids[i])
158                break;
159        if (ctx->filter->codec_ids[i] == AV_CODEC_ID_NONE) {
160            const AVCodecDescriptor *desc = avcodec_descriptor_get(ctx->par_in->codec_id);
161            av_log(ctx, AV_LOG_ERROR, "Codec '%s' (%d) is not supported by the "
162                   "bitstream filter '%s'. Supported codecs are: ",
163                   desc ? desc->name : "unknown", ctx->par_in->codec_id, ctx->filter->name);
164            for (i = 0; ctx->filter->codec_ids[i] != AV_CODEC_ID_NONE; i++) {
165                enum AVCodecID codec_id = ctx->filter->codec_ids[i];
166                av_log(ctx, AV_LOG_ERROR, "%s (%d) ",
167                       avcodec_get_name(codec_id), codec_id);
168            }
169            av_log(ctx, AV_LOG_ERROR, "\n");
170            return AVERROR(EINVAL);
171        }
172    }
173
174    /* initialize output parameters to be the same as input
175     * init below might overwrite that */
176    ret = avcodec_parameters_copy(ctx->par_out, ctx->par_in);
177    if (ret < 0)
178        return ret;
179
180    ctx->time_base_out = ctx->time_base_in;
181
182    if (ff_bsf(ctx->filter)->init) {
183        ret = ff_bsf(ctx->filter)->init(ctx);
184        if (ret < 0)
185            return ret;
186    }
187
188    return 0;
189}
190
191void av_bsf_flush(AVBSFContext *ctx)
192{
193    FFBSFContext *const bsfi = ffbsfcontext(ctx);
194
195    bsfi->eof = 0;
196
197    av_packet_unref(bsfi->buffer_pkt);
198
199    if (ff_bsf(ctx->filter)->flush)
200        ff_bsf(ctx->filter)->flush(ctx);
201}
202
203int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
204{
205    FFBSFContext *const bsfi = ffbsfcontext(ctx);
206    int ret;
207
208    if (!pkt || IS_EMPTY(pkt)) {
209        if (pkt)
210            av_packet_unref(pkt);
211        bsfi->eof = 1;
212        return 0;
213    }
214
215    if (bsfi->eof) {
216        av_log(ctx, AV_LOG_ERROR, "A non-NULL packet sent after an EOF.\n");
217        return AVERROR(EINVAL);
218    }
219
220    if (!IS_EMPTY(bsfi->buffer_pkt))
221        return AVERROR(EAGAIN);
222
223    ret = av_packet_make_refcounted(pkt);
224    if (ret < 0)
225        return ret;
226    av_packet_move_ref(bsfi->buffer_pkt, pkt);
227
228    return 0;
229}
230
231int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
232{
233    return ff_bsf(ctx->filter)->filter(ctx, pkt);
234}
235
236int ff_bsf_get_packet(AVBSFContext *ctx, AVPacket **pkt)
237{
238    FFBSFContext *const bsfi = ffbsfcontext(ctx);
239    AVPacket *tmp_pkt;
240
241    if (bsfi->eof)
242        return AVERROR_EOF;
243
244    if (IS_EMPTY(bsfi->buffer_pkt))
245        return AVERROR(EAGAIN);
246
247    tmp_pkt = av_packet_alloc();
248    if (!tmp_pkt)
249        return AVERROR(ENOMEM);
250
251    *pkt = bsfi->buffer_pkt;
252    bsfi->buffer_pkt = tmp_pkt;
253
254    return 0;
255}
256
257int ff_bsf_get_packet_ref(AVBSFContext *ctx, AVPacket *pkt)
258{
259    FFBSFContext *const bsfi = ffbsfcontext(ctx);
260
261    if (bsfi->eof)
262        return AVERROR_EOF;
263
264    if (IS_EMPTY(bsfi->buffer_pkt))
265        return AVERROR(EAGAIN);
266
267    av_packet_move_ref(pkt, bsfi->buffer_pkt);
268
269    return 0;
270}
271
272typedef struct BSFListContext {
273    const AVClass *class;
274
275    AVBSFContext **bsfs;
276    int nb_bsfs;
277
278    unsigned idx;           // index of currently processed BSF
279
280    char * item_name;
281} BSFListContext;
282
283
284static int bsf_list_init(AVBSFContext *bsf)
285{
286    BSFListContext *lst = bsf->priv_data;
287    int ret, i;
288    const AVCodecParameters *cod_par = bsf->par_in;
289    AVRational tb = bsf->time_base_in;
290
291    for (i = 0; i < lst->nb_bsfs; ++i) {
292        ret = avcodec_parameters_copy(lst->bsfs[i]->par_in, cod_par);
293        if (ret < 0)
294            goto fail;
295
296        lst->bsfs[i]->time_base_in = tb;
297
298        ret = av_bsf_init(lst->bsfs[i]);
299        if (ret < 0)
300            goto fail;
301
302        cod_par = lst->bsfs[i]->par_out;
303        tb = lst->bsfs[i]->time_base_out;
304    }
305
306    bsf->time_base_out = tb;
307    ret = avcodec_parameters_copy(bsf->par_out, cod_par);
308
309fail:
310    return ret;
311}
312
313static int bsf_list_filter(AVBSFContext *bsf, AVPacket *out)
314{
315    BSFListContext *lst = bsf->priv_data;
316    int ret, eof = 0;
317
318    if (!lst->nb_bsfs)
319        return ff_bsf_get_packet_ref(bsf, out);
320
321    while (1) {
322        /* get a packet from the previous filter up the chain */
323        if (lst->idx)
324            ret = av_bsf_receive_packet(lst->bsfs[lst->idx-1], out);
325        else
326            ret = ff_bsf_get_packet_ref(bsf, out);
327        if (ret == AVERROR(EAGAIN)) {
328            if (!lst->idx)
329                return ret;
330            lst->idx--;
331            continue;
332        } else if (ret == AVERROR_EOF) {
333            eof = 1;
334        } else if (ret < 0)
335            return ret;
336
337        /* send it to the next filter down the chain */
338        if (lst->idx < lst->nb_bsfs) {
339            ret = av_bsf_send_packet(lst->bsfs[lst->idx], eof ? NULL : out);
340            av_assert1(ret != AVERROR(EAGAIN));
341            if (ret < 0) {
342                av_packet_unref(out);
343                return ret;
344            }
345            lst->idx++;
346            eof = 0;
347        } else if (eof) {
348            return ret;
349        } else {
350            return 0;
351        }
352    }
353}
354
355static void bsf_list_flush(AVBSFContext *bsf)
356{
357    BSFListContext *lst = bsf->priv_data;
358
359    for (int i = 0; i < lst->nb_bsfs; i++)
360        av_bsf_flush(lst->bsfs[i]);
361    lst->idx = 0;
362}
363
364static void bsf_list_close(AVBSFContext *bsf)
365{
366    BSFListContext *lst = bsf->priv_data;
367    int i;
368
369    for (i = 0; i < lst->nb_bsfs; ++i)
370        av_bsf_free(&lst->bsfs[i]);
371    av_freep(&lst->bsfs);
372    av_freep(&lst->item_name);
373}
374
375static const char *bsf_list_item_name(void *ctx)
376{
377    static const char *null_filter_name = "null";
378    AVBSFContext *bsf_ctx = ctx;
379    BSFListContext *lst = bsf_ctx->priv_data;
380
381    if (!lst->nb_bsfs)
382        return null_filter_name;
383
384    if (!lst->item_name) {
385        int i;
386        AVBPrint bp;
387        av_bprint_init(&bp, 16, 128);
388
389        av_bprintf(&bp, "bsf_list(");
390        for (i = 0; i < lst->nb_bsfs; i++)
391            av_bprintf(&bp, i ? ",%s" : "%s", lst->bsfs[i]->filter->name);
392        av_bprintf(&bp, ")");
393
394        av_bprint_finalize(&bp, &lst->item_name);
395    }
396
397    return lst->item_name;
398}
399
400static const AVClass bsf_list_class = {
401        .class_name = "bsf_list",
402        .item_name  = bsf_list_item_name,
403        .version    = LIBAVUTIL_VERSION_INT,
404};
405
406static const FFBitStreamFilter list_bsf = {
407        .p.name         = "bsf_list",
408        .p.priv_class   = &bsf_list_class,
409        .priv_data_size = sizeof(BSFListContext),
410        .init           = bsf_list_init,
411        .filter         = bsf_list_filter,
412        .flush          = bsf_list_flush,
413        .close          = bsf_list_close,
414};
415
416struct AVBSFList {
417    AVBSFContext **bsfs;
418    int nb_bsfs;
419};
420
421AVBSFList *av_bsf_list_alloc(void)
422{
423    return av_mallocz(sizeof(AVBSFList));
424}
425
426void av_bsf_list_free(AVBSFList **lst)
427{
428    int i;
429
430    if (!*lst)
431        return;
432
433    for (i = 0; i < (*lst)->nb_bsfs; ++i)
434        av_bsf_free(&(*lst)->bsfs[i]);
435    av_free((*lst)->bsfs);
436    av_freep(lst);
437}
438
439int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf)
440{
441    return av_dynarray_add_nofree(&lst->bsfs, &lst->nb_bsfs, bsf);
442}
443
444static int bsf_list_append_internal(AVBSFList *lst, const char *bsf_name, const char *options, AVDictionary ** options_dict)
445{
446    int ret;
447    const AVBitStreamFilter *filter;
448    AVBSFContext *bsf;
449
450    filter = av_bsf_get_by_name(bsf_name);
451    if (!filter)
452        return AVERROR_BSF_NOT_FOUND;
453
454    ret = av_bsf_alloc(filter, &bsf);
455    if (ret < 0)
456        return ret;
457
458    if (options && filter->priv_class) {
459        const AVOption *opt = av_opt_next(bsf->priv_data, NULL);
460        const char * shorthand[2] = {NULL};
461
462        if (opt)
463            shorthand[0] = opt->name;
464
465        ret = av_opt_set_from_string(bsf->priv_data, options, shorthand, "=", ":");
466        if (ret < 0)
467            goto end;
468    }
469
470    if (options_dict) {
471        ret = av_opt_set_dict2(bsf, options_dict, AV_OPT_SEARCH_CHILDREN);
472        if (ret < 0)
473            goto end;
474    }
475
476    ret = av_bsf_list_append(lst, bsf);
477
478end:
479    if (ret < 0)
480        av_bsf_free(&bsf);
481
482    return ret;
483}
484
485int av_bsf_list_append2(AVBSFList *lst, const char *bsf_name, AVDictionary ** options)
486{
487    return bsf_list_append_internal(lst, bsf_name, NULL, options);
488}
489
490int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf)
491{
492    int ret = 0;
493    BSFListContext *ctx;
494
495    if ((*lst)->nb_bsfs == 1) {
496        *bsf = (*lst)->bsfs[0];
497        av_freep(&(*lst)->bsfs);
498        (*lst)->nb_bsfs = 0;
499        goto end;
500    }
501
502    ret = av_bsf_alloc(&list_bsf.p, bsf);
503    if (ret < 0)
504        return ret;
505
506    ctx = (*bsf)->priv_data;
507
508    ctx->bsfs = (*lst)->bsfs;
509    ctx->nb_bsfs = (*lst)->nb_bsfs;
510
511end:
512    av_freep(lst);
513    return ret;
514}
515
516static int bsf_parse_single(char *str, AVBSFList *bsf_lst)
517{
518    char *bsf_name, *bsf_options_str;
519
520    bsf_name = av_strtok(str, "=", &bsf_options_str);
521    if (!bsf_name)
522        return AVERROR(EINVAL);
523
524    return bsf_list_append_internal(bsf_lst, bsf_name, bsf_options_str, NULL);
525}
526
527int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
528{
529    AVBSFList *lst;
530    int ret;
531
532    if (!str)
533        return av_bsf_get_null_filter(bsf_lst);
534
535    lst = av_bsf_list_alloc();
536    if (!lst)
537        return AVERROR(ENOMEM);
538
539    do {
540        char *bsf_str = av_get_token(&str, ",");
541        ret = bsf_parse_single(bsf_str, lst);
542        av_free(bsf_str);
543        if (ret < 0)
544            goto end;
545    } while (*str && *++str);
546
547    ret = av_bsf_list_finalize(&lst, bsf_lst);
548end:
549    if (ret < 0)
550        av_bsf_list_free(&lst);
551    return ret;
552}
553
554int av_bsf_get_null_filter(AVBSFContext **bsf)
555{
556#if CONFIG_NULL_BSF
557    extern const FFBitStreamFilter ff_null_bsf;
558    return av_bsf_alloc(&ff_null_bsf.p, bsf);
559#else
560    return av_bsf_alloc(&list_bsf.p, bsf);
561#endif
562}
563