FFmpeg
Loading...
Searching...
No Matches
atsc_a53.c
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#include <stddef.h>
20#include <stdint.h>
21
23#include "libavutil/mem.h"
24#include "atsc_a53.h"
25
26int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len,
27 void **data, size_t *sei_size)
28{
29 AVFrameSideData *side_data = NULL;
30 uint8_t *sei_data;
31
32 if (frame)
34
35 if (!side_data) {
36 *data = NULL;
37 return 0;
38 }
39
40 *sei_size = side_data->size + 11;
41 *data = av_mallocz(*sei_size + prefix_len);
42 if (!*data)
43 return AVERROR(ENOMEM);
44 sei_data = (uint8_t*)*data + prefix_len;
45
46 // country code
47 sei_data[0] = 181;
48 sei_data[1] = 0;
49 sei_data[2] = 49;
50
51 /**
52 * 'GA94' is standard in North America for ATSC, but hard coding
53 * this style may not be the right thing to do -- other formats
54 * do exist. This information is not available in the side_data
55 * so we are going with this right now.
56 */
57 AV_WL32(sei_data + 3, MKTAG('G', 'A', '9', '4'));
58 sei_data[7] = 3;
59 sei_data[8] = ((side_data->size/3) & 0x1f) | 0x40;
60 sei_data[9] = 0;
61
62 memcpy(sei_data + 10, side_data->data, side_data->size);
63
64 sei_data[side_data->size+10] = 255;
65
66 return 0;
67}
68
69int ff_parse_a53_cc(AVBufferRef **pbuf, const uint8_t *data, int size)
70{
71 AVBufferRef *buf = *pbuf;
72 size_t new_size, old_size = buf ? buf->size : 0;
73 int ret, cc_count;
74
75 if (size < 3)
77
78 if (data[0] != 0x3) // user_data_type_code
79 return 0;
80
81 if (!(data[1] & 0x40)) // process_cc_data_flag
82 return 0;
83
84 cc_count = data[1] & 0x1F;
85 if (!cc_count)
86 return 0;
87
88 // content of data[2] is reserved
89 /* 3 bytes per CC plus one byte marker_bits at the end */
90 if (cc_count * 3 >= size - 3)
92
93 new_size = (old_size + cc_count * 3);
94
95 if (new_size > INT_MAX)
97
98 /* Allow merging of the cc data from two fields. */
99 ret = av_buffer_realloc(pbuf, new_size);
100 if (ret < 0)
101 return ret;
102
103 buf = *pbuf;
104 /* Use of av_buffer_realloc assumes buffer is writeable */
105 memcpy(buf->data + old_size, data + 3, cc_count * 3);
106
107 return cc_count;
108}
int ff_parse_a53_cc(AVBufferRef **pbuf, const uint8_t *data, int size)
Parse a data array for ATSC A53 Part 4 Closed Captions and store them in an AVBufferRef.
Definition atsc_a53.c:69
int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len, void **data, size_t *sei_size)
Check AVFrame for A53 side data and allocate and fill SEI message with A53 info.
Definition atsc_a53.c:26
#define NULL
Definition coverity.c:32
static AVFrame * frame
int av_buffer_realloc(AVBufferRef **pbuf, size_t size)
Reallocate a given buffer.
Definition buffer.c:183
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition frame.c:659
@ AV_FRAME_DATA_A53_CC
ATSC A53 Part 4 Closed Captions.
Definition frame.h:59
#define AV_WL32(p, v)
#define MKTAG(a, b, c, d)
Definition macros.h:55
Memory handling functions.
const char data[16]
Definition mxf.c:149
A reference to a data buffer.
Definition buffer.h:82
uint8_t * data
The data buffer.
Definition buffer.h:90
size_t size
Size of data in bytes.
Definition buffer.h:94
Structure to hold side data for an AVFrame.
Definition frame.h:327
size_t size
Definition frame.h:330
uint8_t * data
Definition frame.h:329
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
#define av_mallocz(s)
int size