FFmpeg
Loading...
Searching...
No Matches
dvbsub_parser.c
Go to the documentation of this file.
1/*
2 * DVB subtitle parser for FFmpeg
3 * Copyright (c) 2005 Ian Caulfield
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#include <inttypes.h>
23#include <string.h>
24
26
27#include "avcodec.h"
28#include "parser_internal.h"
29
30/* Parser (mostly) copied from dvdsub.c */
31
32#define PARSE_BUF_SIZE (65536)
33
34
35/* parser definition */
42
44 AVCodecContext *avctx,
45 const uint8_t **poutbuf, int *poutbuf_size,
46 const uint8_t *buf, int buf_size)
47{
48 DVBSubParseContext *pc = s->priv_data;
49 uint8_t *p, *p_end;
50 int i, len, buf_pos = 0;
51 int out_size = 0;
52
53 ff_dlog(avctx, "DVB parse packet pts=%"PRIx64", lpts=%"PRIx64", cpts=%"PRIx64":\n",
54 s->pts, s->last_pts, s->cur_frame_pts[s->cur_frame_start_index]);
55
56 for (i=0; i < buf_size; i++)
57 {
58 ff_dlog(avctx, "%02x ", buf[i]);
59 if (i % 16 == 15)
60 ff_dlog(avctx, "\n");
61 }
62
63 if (i % 16 != 0)
64 ff_dlog(avctx, "\n");
65
66 *poutbuf = buf;
67 *poutbuf_size = buf_size;
68
69 s->fetch_timestamp = 1;
70
71 if (s->last_pts != s->pts && s->pts != AV_NOPTS_VALUE) /* Start of a new packet */
72 {
73 if (pc->packet_index != pc->packet_start)
74 {
75 ff_dlog(avctx, "Discarding %d bytes\n",
76 pc->packet_index - pc->packet_start);
77 }
78
79 pc->packet_start = 0;
80 pc->packet_index = 0;
81
82 if (buf_size < 2 || buf[0] != 0x20 || buf[1] != 0x00) {
83 ff_dlog(avctx, "Bad packet header\n");
84 return buf_size;
85 }
86
87 buf_pos = 2;
88
89 pc->in_packet = 1;
90 } else {
91 if (pc->packet_start != 0)
92 {
93 if (pc->packet_index != pc->packet_start)
94 {
95 memmove(pc->packet_buf, pc->packet_buf + pc->packet_start,
96 pc->packet_index - pc->packet_start);
97
98 pc->packet_index -= pc->packet_start;
99 pc->packet_start = 0;
100 } else {
101 pc->packet_start = 0;
102 pc->packet_index = 0;
103 }
104 }
105 }
106
107 if (buf_size - buf_pos > PARSE_BUF_SIZE - pc->packet_index)
108 return buf_size;
109
110/* if not currently in a packet, pass data */
111 if (pc->in_packet == 0)
112 return buf_size;
113
114 memcpy(pc->packet_buf + pc->packet_index, buf + buf_pos, buf_size - buf_pos);
115 pc->packet_index += buf_size - buf_pos;
116
117 p = pc->packet_buf;
118 p_end = pc->packet_buf + pc->packet_index;
119
120 while (p < p_end)
121 {
122 if (*p == 0x0f)
123 {
124 if (6 <= p_end - p)
125 {
126 len = AV_RB16(p + 4);
127
128 if (len + 6 <= p_end - p)
129 {
130 out_size += len + 6;
131
132 p += len + 6;
133 } else
134 break;
135 } else
136 break;
137 } else if (*p == 0xff) {
138 if (1 < p_end - p)
139 {
140 ff_dlog(avctx, "Junk at end of packet\n");
141 }
142 pc->packet_index = p - pc->packet_buf;
143 pc->in_packet = 0;
144 break;
145 } else {
146 av_log(avctx, AV_LOG_ERROR, "Junk in packet\n");
147
148 pc->packet_index = p - pc->packet_buf;
149 pc->in_packet = 0;
150 break;
151 }
152 }
153
154 if (out_size > 0)
155 {
156 *poutbuf = pc->packet_buf;
157 *poutbuf_size = out_size;
158 pc->packet_start = *poutbuf_size;
159 }
160
161 if (s->pts == AV_NOPTS_VALUE)
162 s->pts = s->last_pts;
163
164 return buf_size;
165}
166
static int out_size
static int parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition apv_parser.c:92
Libavcodec external API header.
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
const FFCodecParser ff_dvbsub_parser
#define PARSE_BUF_SIZE
static int dvbsub_parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
@ AV_CODEC_ID_DVB_SUBTITLE
Definition codec_id.h:567
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
#define AV_RB16(p)
#define PARSER_CODEC_LIST(...)
main external API structure.
Definition avcodec.h:443
uint8_t packet_buf[PARSE_BUF_SIZE]
#define ff_dlog(a,...)
#define av_log(a,...)
int len