Imported Upstream version 6.1
[platform/upstream/ffmpeg.git] / libavfilter / ccfifo.h
1 /*
2  * CEA-708 Closed Captioning FIFO
3  * Copyright (c) 2023 LTN Global Communications
4  *
5  * Author: Devin Heitmueller <dheitmueller@ltnglobal.com>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23
24 /**
25  * @file
26  * CC FIFO Buffer
27  */
28
29 #ifndef AVFILTER_CCFIFO_H
30 #define AVFILTER_CCFIFO_H
31
32 #include "libavutil/avutil.h"
33 #include "libavutil/frame.h"
34 #include "libavutil/fifo.h"
35
36 typedef struct CCFifo {
37     AVFifo *cc_608_fifo;
38     AVFifo *cc_708_fifo;
39     AVRational framerate;
40     int expected_cc_count;
41     int expected_608;
42     int cc_detected;
43     int passthrough;
44     int passthrough_warning;
45     void *log_ctx;
46 } CCFifo;
47
48 /**
49  * Initialize a CCFifo.
50  *
51  * @param framerate   output framerate
52  * @param log_ctx     used for any av_log() calls
53  * @return            Zero on success, or negative AVERROR code on failure.
54  */
55 int ff_ccfifo_init(CCFifo *ccf, AVRational framerate, void *log_ctx);
56
57 /**
58  * Free all memory allocated in a CCFifo and clear the context.
59  *
60  * @param ccf Pointer to the CCFifo which should be uninitialized
61  */
62 void ff_ccfifo_uninit(CCFifo *ccf);
63
64 /**
65  * Extract CC data from an AVFrame
66  *
67  * Extract CC bytes from the AVFrame, insert them into our queue, and
68  * remove the side data from the AVFrame.  The side data is removed
69  * as it will be re-inserted at the appropriate rate later in the
70  * filter.
71  *
72  * @param af          CCFifo to write to
73  * @param frame       AVFrame with the video frame to operate on
74  * @return            Zero on success, or negative AVERROR
75  *                    code on failure.
76  */
77 int ff_ccfifo_extract(CCFifo *ccf, AVFrame *frame);
78
79 /**
80  *Just like ff_ccfifo_extract(), but takes the raw bytes instead of an AVFrame
81  */
82 int ff_ccfifo_extractbytes(CCFifo *ccf, uint8_t *data, size_t len);
83
84 /**
85  * Provide the size in bytes of an output buffer to allocate
86  *
87  * Ask for how many bytes the output will contain, so the caller can allocate
88  * an appropriately sized buffer and pass it to ff_ccfifo_injectbytes()
89  *
90  */
91 int ff_ccfifo_getoutputsize(const CCFifo *ccf);
92
93 /**
94  * Insert CC data from the FIFO into an AVFrame (as side data)
95  *
96  * Dequeue the appropriate number of CC tuples based on the
97  * frame rate, and insert them into the AVFrame
98  *
99  * @param af          CCFifo to read from
100  * @param frame       AVFrame with the video frame to operate on
101  * @return            Zero on success, or negative AVERROR
102  *                    code on failure.
103  */
104 int ff_ccfifo_inject(CCFifo *ccf, AVFrame *frame);
105
106 /**
107  * Just like ff_ccfifo_inject(), but takes the raw bytes to insert the CC data
108  * int rather than an AVFrame
109  */
110 int ff_ccfifo_injectbytes(CCFifo *ccf, uint8_t *data, size_t len);
111
112 /**
113  * Returns 1 if captions have been found as a prior call
114  * to ff_ccfifo_extract() or ff_ccfifo_extractbytes()
115  */
116 int ff_ccfifo_ccdetected(const CCFifo *ccf);
117
118 #endif /* AVFILTER_CCFIFO_H */