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