FFmpeg
libavcodec
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
25
#include "
libavutil/intreadwrite.h
"
26
27
#include "
avcodec.h
"
28
#include "
internal.h
"
29
30
/* Parser (mostly) copied from dvdsub.c */
31
32
#define PARSE_BUF_SIZE (65536)
33
34
35
/* parser definition */
36
typedef
struct
DVBSubParseContext
{
37
int
packet_start
;
38
int
packet_index
;
39
int
in_packet
;
40
uint8_t
packet_buf
[
PARSE_BUF_SIZE
];
41
}
DVBSubParseContext
;
42
43
static
int
dvbsub_parse
(
AVCodecParserContext
*
s
,
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 + pc->
packet_index
>
PARSE_BUF_SIZE
)
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
167
const
AVCodecParser
ff_dvbsub_parser
= {
168
.
codec_ids
= {
AV_CODEC_ID_DVB_SUBTITLE
},
169
.priv_data_size =
sizeof
(
DVBSubParseContext
),
170
.parser_parse =
dvbsub_parse
,
171
};
DVBSubParseContext::packet_start
int packet_start
Definition:
dvbsub_parser.c:37
out_size
int out_size
Definition:
movenc.c:55
internal.h
DVBSubParseContext::packet_index
int packet_index
Definition:
dvbsub_parser.c:38
AV_CODEC_ID_DVB_SUBTITLE
@ AV_CODEC_ID_DVB_SUBTITLE
Definition:
codec_id.h:523
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition:
log.h:180
intreadwrite.h
s
#define s(width, name)
Definition:
cbs_vp9.c:257
DVBSubParseContext::packet_buf
uint8_t packet_buf[PARSE_BUF_SIZE]
Definition:
dvbsub_parser.c:40
ff_dlog
#define ff_dlog(a,...)
Definition:
tableprint_vlc.h:29
AVCodecParser::codec_ids
int codec_ids[7]
Definition:
avcodec.h:2935
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition:
avutil.h:248
PARSE_BUF_SIZE
#define PARSE_BUF_SIZE
Definition:
dvbsub_parser.c:32
DVBSubParseContext
Definition:
dvbsub_parser.c:36
i
#define i(width, name, range_min, range_max)
Definition:
cbs_h2645.c:271
len
int len
Definition:
vorbis_enc_data.h:426
avcodec.h
AVCodecParserContext
Definition:
avcodec.h:2775
DVBSubParseContext::in_packet
int in_packet
Definition:
dvbsub_parser.c:39
AVCodecContext
main external API structure.
Definition:
avcodec.h:383
ff_dvbsub_parser
const AVCodecParser ff_dvbsub_parser
Definition:
dvbsub_parser.c:167
AVCodecParser
Definition:
avcodec.h:2934
av_log
#define av_log(a,...)
Definition:
tableprint_vlc.h:28
dvbsub_parse
static int dvbsub_parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition:
dvbsub_parser.c:43
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition:
bytestream.h:98
Generated on Wed Aug 24 2022 21:37:32 for FFmpeg by
1.8.17