ffmpeg / libavformat / mpegts.c @ 6ae38aa3
History | View | Annotate | Download (58 KB)
1 |
/*
|
---|---|
2 |
* MPEG2 transport stream (aka DVB) demuxer
|
3 |
* Copyright (c) 2002-2003 Fabrice Bellard
|
4 |
*
|
5 |
* This file is part of Libav.
|
6 |
*
|
7 |
* Libav 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 |
* Libav 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 Libav; if not, write to the Free Software
|
19 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 |
*/
|
21 |
|
22 |
//#define DEBUG
|
23 |
//#define DEBUG_SEEK
|
24 |
//#define USE_SYNCPOINT_SEARCH
|
25 |
|
26 |
#include "libavutil/crc.h" |
27 |
#include "libavutil/intreadwrite.h" |
28 |
#include "libavcodec/bytestream.h" |
29 |
#include "avformat.h" |
30 |
#include "mpegts.h" |
31 |
#include "internal.h" |
32 |
#include "avio_internal.h" |
33 |
#include "seek.h" |
34 |
#include "mpeg.h" |
35 |
#include "isom.h" |
36 |
|
37 |
/* maximum size in which we look for synchronisation if
|
38 |
synchronisation is lost */
|
39 |
#define MAX_RESYNC_SIZE 65536 |
40 |
|
41 |
#define MAX_PES_PAYLOAD 200*1024 |
42 |
|
43 |
enum MpegTSFilterType {
|
44 |
MPEGTS_PES, |
45 |
MPEGTS_SECTION, |
46 |
}; |
47 |
|
48 |
typedef struct MpegTSFilter MpegTSFilter; |
49 |
|
50 |
typedef int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos); |
51 |
|
52 |
typedef struct MpegTSPESFilter { |
53 |
PESCallback *pes_cb; |
54 |
void *opaque;
|
55 |
} MpegTSPESFilter; |
56 |
|
57 |
typedef void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len); |
58 |
|
59 |
typedef void SetServiceCallback(void *opaque, int ret); |
60 |
|
61 |
typedef struct MpegTSSectionFilter { |
62 |
int section_index;
|
63 |
int section_h_size;
|
64 |
uint8_t *section_buf; |
65 |
unsigned int check_crc:1; |
66 |
unsigned int end_of_section_reached:1; |
67 |
SectionCallback *section_cb; |
68 |
void *opaque;
|
69 |
} MpegTSSectionFilter; |
70 |
|
71 |
struct MpegTSFilter {
|
72 |
int pid;
|
73 |
int last_cc; /* last cc code (-1 if first packet) */ |
74 |
enum MpegTSFilterType type;
|
75 |
union {
|
76 |
MpegTSPESFilter pes_filter; |
77 |
MpegTSSectionFilter section_filter; |
78 |
} u; |
79 |
}; |
80 |
|
81 |
#define MAX_PIDS_PER_PROGRAM 64 |
82 |
struct Program {
|
83 |
unsigned int id; //program id/service id |
84 |
unsigned int nb_pids; |
85 |
unsigned int pids[MAX_PIDS_PER_PROGRAM]; |
86 |
}; |
87 |
|
88 |
struct MpegTSContext {
|
89 |
/* user data */
|
90 |
AVFormatContext *stream; |
91 |
/** raw packet size, including FEC if present */
|
92 |
int raw_packet_size;
|
93 |
|
94 |
int pos47;
|
95 |
|
96 |
/** if true, all pids are analyzed to find streams */
|
97 |
int auto_guess;
|
98 |
|
99 |
/** compute exact PCR for each transport stream packet */
|
100 |
int mpeg2ts_compute_pcr;
|
101 |
|
102 |
int64_t cur_pcr; /**< used to estimate the exact PCR */
|
103 |
int pcr_incr; /**< used to estimate the exact PCR */ |
104 |
|
105 |
/* data needed to handle file based ts */
|
106 |
/** stop parsing loop */
|
107 |
int stop_parse;
|
108 |
/** packet containing Audio/Video data */
|
109 |
AVPacket *pkt; |
110 |
/** to detect seek */
|
111 |
int64_t last_pos; |
112 |
|
113 |
/******************************************/
|
114 |
/* private mpegts data */
|
115 |
/* scan context */
|
116 |
/** structure to keep track of Program->pids mapping */
|
117 |
unsigned int nb_prg; |
118 |
struct Program *prg;
|
119 |
|
120 |
|
121 |
/** filters for various streams specified by PMT + for the PAT and PMT */
|
122 |
MpegTSFilter *pids[NB_PID_MAX]; |
123 |
}; |
124 |
|
125 |
/* TS stream handling */
|
126 |
|
127 |
enum MpegTSState {
|
128 |
MPEGTS_HEADER = 0,
|
129 |
MPEGTS_PESHEADER, |
130 |
MPEGTS_PESHEADER_FILL, |
131 |
MPEGTS_PAYLOAD, |
132 |
MPEGTS_SKIP, |
133 |
}; |
134 |
|
135 |
/* enough for PES header + length */
|
136 |
#define PES_START_SIZE 6 |
137 |
#define PES_HEADER_SIZE 9 |
138 |
#define MAX_PES_HEADER_SIZE (9 + 255) |
139 |
|
140 |
typedef struct PESContext { |
141 |
int pid;
|
142 |
int pcr_pid; /**< if -1 then all packets containing PCR are considered */ |
143 |
int stream_type;
|
144 |
MpegTSContext *ts; |
145 |
AVFormatContext *stream; |
146 |
AVStream *st; |
147 |
AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
|
148 |
enum MpegTSState state;
|
149 |
/* used to get the format */
|
150 |
int data_index;
|
151 |
int total_size;
|
152 |
int pes_header_size;
|
153 |
int extended_stream_id;
|
154 |
int64_t pts, dts; |
155 |
int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
|
156 |
uint8_t header[MAX_PES_HEADER_SIZE]; |
157 |
uint8_t *buffer; |
158 |
} PESContext; |
159 |
|
160 |
extern AVInputFormat ff_mpegts_demuxer;
|
161 |
|
162 |
static void clear_program(MpegTSContext *ts, unsigned int programid) |
163 |
{ |
164 |
int i;
|
165 |
|
166 |
for(i=0; i<ts->nb_prg; i++) |
167 |
if(ts->prg[i].id == programid)
|
168 |
ts->prg[i].nb_pids = 0;
|
169 |
} |
170 |
|
171 |
static void clear_programs(MpegTSContext *ts) |
172 |
{ |
173 |
av_freep(&ts->prg); |
174 |
ts->nb_prg=0;
|
175 |
} |
176 |
|
177 |
static void add_pat_entry(MpegTSContext *ts, unsigned int programid) |
178 |
{ |
179 |
struct Program *p;
|
180 |
void *tmp = av_realloc(ts->prg, (ts->nb_prg+1)*sizeof(struct Program)); |
181 |
if(!tmp)
|
182 |
return;
|
183 |
ts->prg = tmp; |
184 |
p = &ts->prg[ts->nb_prg]; |
185 |
p->id = programid; |
186 |
p->nb_pids = 0;
|
187 |
ts->nb_prg++; |
188 |
} |
189 |
|
190 |
static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid) |
191 |
{ |
192 |
int i;
|
193 |
struct Program *p = NULL; |
194 |
for(i=0; i<ts->nb_prg; i++) { |
195 |
if(ts->prg[i].id == programid) {
|
196 |
p = &ts->prg[i]; |
197 |
break;
|
198 |
} |
199 |
} |
200 |
if(!p)
|
201 |
return;
|
202 |
|
203 |
if(p->nb_pids >= MAX_PIDS_PER_PROGRAM)
|
204 |
return;
|
205 |
p->pids[p->nb_pids++] = pid; |
206 |
} |
207 |
|
208 |
/**
|
209 |
* \brief discard_pid() decides if the pid is to be discarded according
|
210 |
* to caller's programs selection
|
211 |
* \param ts : - TS context
|
212 |
* \param pid : - pid
|
213 |
* \return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
|
214 |
* 0 otherwise
|
215 |
*/
|
216 |
static int discard_pid(MpegTSContext *ts, unsigned int pid) |
217 |
{ |
218 |
int i, j, k;
|
219 |
int used = 0, discarded = 0; |
220 |
struct Program *p;
|
221 |
for(i=0; i<ts->nb_prg; i++) { |
222 |
p = &ts->prg[i]; |
223 |
for(j=0; j<p->nb_pids; j++) { |
224 |
if(p->pids[j] != pid)
|
225 |
continue;
|
226 |
//is program with id p->id set to be discarded?
|
227 |
for(k=0; k<ts->stream->nb_programs; k++) { |
228 |
if(ts->stream->programs[k]->id == p->id) {
|
229 |
if(ts->stream->programs[k]->discard == AVDISCARD_ALL)
|
230 |
discarded++; |
231 |
else
|
232 |
used++; |
233 |
} |
234 |
} |
235 |
} |
236 |
} |
237 |
|
238 |
return !used && discarded;
|
239 |
} |
240 |
|
241 |
/**
|
242 |
* Assemble PES packets out of TS packets, and then call the "section_cb"
|
243 |
* function when they are complete.
|
244 |
*/
|
245 |
static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1, |
246 |
const uint8_t *buf, int buf_size, int is_start) |
247 |
{ |
248 |
MpegTSSectionFilter *tss = &tss1->u.section_filter; |
249 |
int len;
|
250 |
|
251 |
if (is_start) {
|
252 |
memcpy(tss->section_buf, buf, buf_size); |
253 |
tss->section_index = buf_size; |
254 |
tss->section_h_size = -1;
|
255 |
tss->end_of_section_reached = 0;
|
256 |
} else {
|
257 |
if (tss->end_of_section_reached)
|
258 |
return;
|
259 |
len = 4096 - tss->section_index;
|
260 |
if (buf_size < len)
|
261 |
len = buf_size; |
262 |
memcpy(tss->section_buf + tss->section_index, buf, len); |
263 |
tss->section_index += len; |
264 |
} |
265 |
|
266 |
/* compute section length if possible */
|
267 |
if (tss->section_h_size == -1 && tss->section_index >= 3) { |
268 |
len = (AV_RB16(tss->section_buf + 1) & 0xfff) + 3; |
269 |
if (len > 4096) |
270 |
return;
|
271 |
tss->section_h_size = len; |
272 |
} |
273 |
|
274 |
if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) { |
275 |
tss->end_of_section_reached = 1;
|
276 |
if (!tss->check_crc ||
|
277 |
av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1,
|
278 |
tss->section_buf, tss->section_h_size) == 0)
|
279 |
tss->section_cb(tss1, tss->section_buf, tss->section_h_size); |
280 |
} |
281 |
} |
282 |
|
283 |
static MpegTSFilter *mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid, |
284 |
SectionCallback *section_cb, void *opaque,
|
285 |
int check_crc)
|
286 |
|
287 |
{ |
288 |
MpegTSFilter *filter; |
289 |
MpegTSSectionFilter *sec; |
290 |
|
291 |
av_dlog(ts->stream, "Filter: pid=0x%x\n", pid);
|
292 |
|
293 |
if (pid >= NB_PID_MAX || ts->pids[pid])
|
294 |
return NULL; |
295 |
filter = av_mallocz(sizeof(MpegTSFilter));
|
296 |
if (!filter)
|
297 |
return NULL; |
298 |
ts->pids[pid] = filter; |
299 |
filter->type = MPEGTS_SECTION; |
300 |
filter->pid = pid; |
301 |
filter->last_cc = -1;
|
302 |
sec = &filter->u.section_filter; |
303 |
sec->section_cb = section_cb; |
304 |
sec->opaque = opaque; |
305 |
sec->section_buf = av_malloc(MAX_SECTION_SIZE); |
306 |
sec->check_crc = check_crc; |
307 |
if (!sec->section_buf) {
|
308 |
av_free(filter); |
309 |
return NULL; |
310 |
} |
311 |
return filter;
|
312 |
} |
313 |
|
314 |
static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, |
315 |
PESCallback *pes_cb, |
316 |
void *opaque)
|
317 |
{ |
318 |
MpegTSFilter *filter; |
319 |
MpegTSPESFilter *pes; |
320 |
|
321 |
if (pid >= NB_PID_MAX || ts->pids[pid])
|
322 |
return NULL; |
323 |
filter = av_mallocz(sizeof(MpegTSFilter));
|
324 |
if (!filter)
|
325 |
return NULL; |
326 |
ts->pids[pid] = filter; |
327 |
filter->type = MPEGTS_PES; |
328 |
filter->pid = pid; |
329 |
filter->last_cc = -1;
|
330 |
pes = &filter->u.pes_filter; |
331 |
pes->pes_cb = pes_cb; |
332 |
pes->opaque = opaque; |
333 |
return filter;
|
334 |
} |
335 |
|
336 |
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter) |
337 |
{ |
338 |
int pid;
|
339 |
|
340 |
pid = filter->pid; |
341 |
if (filter->type == MPEGTS_SECTION)
|
342 |
av_freep(&filter->u.section_filter.section_buf); |
343 |
else if (filter->type == MPEGTS_PES) { |
344 |
PESContext *pes = filter->u.pes_filter.opaque; |
345 |
av_freep(&pes->buffer); |
346 |
/* referenced private data will be freed later in
|
347 |
* av_close_input_stream */
|
348 |
if (!((PESContext *)filter->u.pes_filter.opaque)->st) {
|
349 |
av_freep(&filter->u.pes_filter.opaque); |
350 |
} |
351 |
} |
352 |
|
353 |
av_free(filter); |
354 |
ts->pids[pid] = NULL;
|
355 |
} |
356 |
|
357 |
static int analyze(const uint8_t *buf, int size, int packet_size, int *index){ |
358 |
int stat[TS_MAX_PACKET_SIZE];
|
359 |
int i;
|
360 |
int x=0; |
361 |
int best_score=0; |
362 |
|
363 |
memset(stat, 0, packet_size*sizeof(int)); |
364 |
|
365 |
for(x=i=0; i<size-3; i++){ |
366 |
if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && (buf[i+3] & 0x30)){ |
367 |
stat[x]++; |
368 |
if(stat[x] > best_score){
|
369 |
best_score= stat[x]; |
370 |
if(index) *index= x;
|
371 |
} |
372 |
} |
373 |
|
374 |
x++; |
375 |
if(x == packet_size) x= 0; |
376 |
} |
377 |
|
378 |
return best_score;
|
379 |
} |
380 |
|
381 |
/* autodetect fec presence. Must have at least 1024 bytes */
|
382 |
static int get_packet_size(const uint8_t *buf, int size) |
383 |
{ |
384 |
int score, fec_score, dvhs_score;
|
385 |
|
386 |
if (size < (TS_FEC_PACKET_SIZE * 5 + 1)) |
387 |
return -1; |
388 |
|
389 |
score = analyze(buf, size, TS_PACKET_SIZE, NULL);
|
390 |
dvhs_score = analyze(buf, size, TS_DVHS_PACKET_SIZE, NULL);
|
391 |
fec_score= analyze(buf, size, TS_FEC_PACKET_SIZE, NULL);
|
392 |
// av_log(NULL, AV_LOG_DEBUG, "score: %d, dvhs_score: %d, fec_score: %d \n", score, dvhs_score, fec_score);
|
393 |
|
394 |
if (score > fec_score && score > dvhs_score) return TS_PACKET_SIZE; |
395 |
else if(dvhs_score > score && dvhs_score > fec_score) return TS_DVHS_PACKET_SIZE; |
396 |
else if(score < fec_score && dvhs_score < fec_score) return TS_FEC_PACKET_SIZE; |
397 |
else return -1; |
398 |
} |
399 |
|
400 |
typedef struct SectionHeader { |
401 |
uint8_t tid; |
402 |
uint16_t id; |
403 |
uint8_t version; |
404 |
uint8_t sec_num; |
405 |
uint8_t last_sec_num; |
406 |
} SectionHeader; |
407 |
|
408 |
static inline int get8(const uint8_t **pp, const uint8_t *p_end) |
409 |
{ |
410 |
const uint8_t *p;
|
411 |
int c;
|
412 |
|
413 |
p = *pp; |
414 |
if (p >= p_end)
|
415 |
return -1; |
416 |
c = *p++; |
417 |
*pp = p; |
418 |
return c;
|
419 |
} |
420 |
|
421 |
static inline int get16(const uint8_t **pp, const uint8_t *p_end) |
422 |
{ |
423 |
const uint8_t *p;
|
424 |
int c;
|
425 |
|
426 |
p = *pp; |
427 |
if ((p + 1) >= p_end) |
428 |
return -1; |
429 |
c = AV_RB16(p); |
430 |
p += 2;
|
431 |
*pp = p; |
432 |
return c;
|
433 |
} |
434 |
|
435 |
/* read and allocate a DVB string preceeded by its length */
|
436 |
static char *getstr8(const uint8_t **pp, const uint8_t *p_end) |
437 |
{ |
438 |
int len;
|
439 |
const uint8_t *p;
|
440 |
char *str;
|
441 |
|
442 |
p = *pp; |
443 |
len = get8(&p, p_end); |
444 |
if (len < 0) |
445 |
return NULL; |
446 |
if ((p + len) > p_end)
|
447 |
return NULL; |
448 |
str = av_malloc(len + 1);
|
449 |
if (!str)
|
450 |
return NULL; |
451 |
memcpy(str, p, len); |
452 |
str[len] = '\0';
|
453 |
p += len; |
454 |
*pp = p; |
455 |
return str;
|
456 |
} |
457 |
|
458 |
static int parse_section_header(SectionHeader *h, |
459 |
const uint8_t **pp, const uint8_t *p_end) |
460 |
{ |
461 |
int val;
|
462 |
|
463 |
val = get8(pp, p_end); |
464 |
if (val < 0) |
465 |
return -1; |
466 |
h->tid = val; |
467 |
*pp += 2;
|
468 |
val = get16(pp, p_end); |
469 |
if (val < 0) |
470 |
return -1; |
471 |
h->id = val; |
472 |
val = get8(pp, p_end); |
473 |
if (val < 0) |
474 |
return -1; |
475 |
h->version = (val >> 1) & 0x1f; |
476 |
val = get8(pp, p_end); |
477 |
if (val < 0) |
478 |
return -1; |
479 |
h->sec_num = val; |
480 |
val = get8(pp, p_end); |
481 |
if (val < 0) |
482 |
return -1; |
483 |
h->last_sec_num = val; |
484 |
return 0; |
485 |
} |
486 |
|
487 |
typedef struct { |
488 |
uint32_t stream_type; |
489 |
enum AVMediaType codec_type;
|
490 |
enum CodecID codec_id;
|
491 |
} StreamType; |
492 |
|
493 |
static const StreamType ISO_types[] = { |
494 |
{ 0x01, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO },
|
495 |
{ 0x02, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO },
|
496 |
{ 0x03, AVMEDIA_TYPE_AUDIO, CODEC_ID_MP3 },
|
497 |
{ 0x04, AVMEDIA_TYPE_AUDIO, CODEC_ID_MP3 },
|
498 |
{ 0x0f, AVMEDIA_TYPE_AUDIO, CODEC_ID_AAC },
|
499 |
{ 0x10, AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG4 },
|
500 |
{ 0x11, AVMEDIA_TYPE_AUDIO, CODEC_ID_AAC_LATM }, /* LATM syntax */ |
501 |
{ 0x1b, AVMEDIA_TYPE_VIDEO, CODEC_ID_H264 },
|
502 |
{ 0xd1, AVMEDIA_TYPE_VIDEO, CODEC_ID_DIRAC },
|
503 |
{ 0xea, AVMEDIA_TYPE_VIDEO, CODEC_ID_VC1 },
|
504 |
{ 0 },
|
505 |
}; |
506 |
|
507 |
static const StreamType HDMV_types[] = { |
508 |
{ 0x80, AVMEDIA_TYPE_AUDIO, CODEC_ID_PCM_BLURAY },
|
509 |
{ 0x81, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 },
|
510 |
{ 0x82, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS },
|
511 |
{ 0x83, AVMEDIA_TYPE_AUDIO, CODEC_ID_TRUEHD },
|
512 |
{ 0x84, AVMEDIA_TYPE_AUDIO, CODEC_ID_EAC3 },
|
513 |
{ 0x90, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_HDMV_PGS_SUBTITLE },
|
514 |
{ 0 },
|
515 |
}; |
516 |
|
517 |
/* ATSC ? */
|
518 |
static const StreamType MISC_types[] = { |
519 |
{ 0x81, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 },
|
520 |
{ 0x8a, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS },
|
521 |
{ 0 },
|
522 |
}; |
523 |
|
524 |
static const StreamType REGD_types[] = { |
525 |
{ MKTAG('d','r','a','c'), AVMEDIA_TYPE_VIDEO, CODEC_ID_DIRAC }, |
526 |
{ MKTAG('A','C','-','3'), AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 }, |
527 |
{ MKTAG('B','S','S','D'), AVMEDIA_TYPE_AUDIO, CODEC_ID_S302M }, |
528 |
{ 0 },
|
529 |
}; |
530 |
|
531 |
/* descriptor present */
|
532 |
static const StreamType DESC_types[] = { |
533 |
{ 0x6a, AVMEDIA_TYPE_AUDIO, CODEC_ID_AC3 }, /* AC-3 descriptor */ |
534 |
{ 0x7a, AVMEDIA_TYPE_AUDIO, CODEC_ID_EAC3 }, /* E-AC-3 descriptor */ |
535 |
{ 0x7b, AVMEDIA_TYPE_AUDIO, CODEC_ID_DTS },
|
536 |
{ 0x56, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_DVB_TELETEXT },
|
537 |
{ 0x59, AVMEDIA_TYPE_SUBTITLE, CODEC_ID_DVB_SUBTITLE }, /* subtitling descriptor */ |
538 |
{ 0 },
|
539 |
}; |
540 |
|
541 |
static void mpegts_find_stream_type(AVStream *st, |
542 |
uint32_t stream_type, const StreamType *types)
|
543 |
{ |
544 |
for (; types->stream_type; types++) {
|
545 |
if (stream_type == types->stream_type) {
|
546 |
st->codec->codec_type = types->codec_type; |
547 |
st->codec->codec_id = types->codec_id; |
548 |
return;
|
549 |
} |
550 |
} |
551 |
} |
552 |
|
553 |
static int mpegts_set_stream_info(AVStream *st, PESContext *pes, |
554 |
uint32_t stream_type, uint32_t prog_reg_desc) |
555 |
{ |
556 |
av_set_pts_info(st, 33, 1, 90000); |
557 |
st->priv_data = pes; |
558 |
st->codec->codec_type = AVMEDIA_TYPE_DATA; |
559 |
st->codec->codec_id = CODEC_ID_NONE; |
560 |
st->need_parsing = AVSTREAM_PARSE_FULL; |
561 |
pes->st = st; |
562 |
pes->stream_type = stream_type; |
563 |
|
564 |
av_log(pes->stream, AV_LOG_DEBUG, |
565 |
"stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
|
566 |
st->index, pes->stream_type, pes->pid, (char*)&prog_reg_desc);
|
567 |
|
568 |
st->codec->codec_tag = pes->stream_type; |
569 |
|
570 |
mpegts_find_stream_type(st, pes->stream_type, ISO_types); |
571 |
if (prog_reg_desc == AV_RL32("HDMV") && |
572 |
st->codec->codec_id == CODEC_ID_NONE) { |
573 |
mpegts_find_stream_type(st, pes->stream_type, HDMV_types); |
574 |
if (pes->stream_type == 0x83) { |
575 |
// HDMV TrueHD streams also contain an AC3 coded version of the
|
576 |
// audio track - add a second stream for this
|
577 |
AVStream *sub_st; |
578 |
// priv_data cannot be shared between streams
|
579 |
PESContext *sub_pes = av_malloc(sizeof(*sub_pes));
|
580 |
if (!sub_pes)
|
581 |
return AVERROR(ENOMEM);
|
582 |
memcpy(sub_pes, pes, sizeof(*sub_pes));
|
583 |
|
584 |
sub_st = av_new_stream(pes->stream, pes->pid); |
585 |
if (!sub_st) {
|
586 |
av_free(sub_pes); |
587 |
return AVERROR(ENOMEM);
|
588 |
} |
589 |
|
590 |
av_set_pts_info(sub_st, 33, 1, 90000); |
591 |
sub_st->priv_data = sub_pes; |
592 |
sub_st->codec->codec_type = AVMEDIA_TYPE_AUDIO; |
593 |
sub_st->codec->codec_id = CODEC_ID_AC3; |
594 |
sub_st->need_parsing = AVSTREAM_PARSE_FULL; |
595 |
sub_pes->sub_st = pes->sub_st = sub_st; |
596 |
} |
597 |
} |
598 |
if (st->codec->codec_id == CODEC_ID_NONE)
|
599 |
mpegts_find_stream_type(st, pes->stream_type, MISC_types); |
600 |
|
601 |
return 0; |
602 |
} |
603 |
|
604 |
static void new_pes_packet(PESContext *pes, AVPacket *pkt) |
605 |
{ |
606 |
av_init_packet(pkt); |
607 |
|
608 |
pkt->destruct = av_destruct_packet; |
609 |
pkt->data = pes->buffer; |
610 |
pkt->size = pes->data_index; |
611 |
memset(pkt->data+pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
|
612 |
|
613 |
// Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
|
614 |
if (pes->sub_st && pes->stream_type == 0x83 && pes->extended_stream_id == 0x76) |
615 |
pkt->stream_index = pes->sub_st->index; |
616 |
else
|
617 |
pkt->stream_index = pes->st->index; |
618 |
pkt->pts = pes->pts; |
619 |
pkt->dts = pes->dts; |
620 |
/* store position of first TS packet of this PES packet */
|
621 |
pkt->pos = pes->ts_packet_pos; |
622 |
|
623 |
/* reset pts values */
|
624 |
pes->pts = AV_NOPTS_VALUE; |
625 |
pes->dts = AV_NOPTS_VALUE; |
626 |
pes->buffer = NULL;
|
627 |
pes->data_index = 0;
|
628 |
} |
629 |
|
630 |
/* return non zero if a packet could be constructed */
|
631 |
static int mpegts_push_data(MpegTSFilter *filter, |
632 |
const uint8_t *buf, int buf_size, int is_start, |
633 |
int64_t pos) |
634 |
{ |
635 |
PESContext *pes = filter->u.pes_filter.opaque; |
636 |
MpegTSContext *ts = pes->ts; |
637 |
const uint8_t *p;
|
638 |
int len, code;
|
639 |
|
640 |
if(!ts->pkt)
|
641 |
return 0; |
642 |
|
643 |
if (is_start) {
|
644 |
if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) { |
645 |
new_pes_packet(pes, ts->pkt); |
646 |
ts->stop_parse = 1;
|
647 |
} |
648 |
pes->state = MPEGTS_HEADER; |
649 |
pes->data_index = 0;
|
650 |
pes->ts_packet_pos = pos; |
651 |
} |
652 |
p = buf; |
653 |
while (buf_size > 0) { |
654 |
switch(pes->state) {
|
655 |
case MPEGTS_HEADER:
|
656 |
len = PES_START_SIZE - pes->data_index; |
657 |
if (len > buf_size)
|
658 |
len = buf_size; |
659 |
memcpy(pes->header + pes->data_index, p, len); |
660 |
pes->data_index += len; |
661 |
p += len; |
662 |
buf_size -= len; |
663 |
if (pes->data_index == PES_START_SIZE) {
|
664 |
/* we got all the PES or section header. We can now
|
665 |
decide */
|
666 |
if (pes->header[0] == 0x00 && pes->header[1] == 0x00 && |
667 |
pes->header[2] == 0x01) { |
668 |
/* it must be an mpeg2 PES stream */
|
669 |
code = pes->header[3] | 0x100; |
670 |
av_dlog(pes->stream, "pid=%x pes_code=%#x\n", pes->pid, code);
|
671 |
|
672 |
if ((pes->st && pes->st->discard == AVDISCARD_ALL) ||
|
673 |
code == 0x1be) /* padding_stream */ |
674 |
goto skip;
|
675 |
|
676 |
/* stream not present in PMT */
|
677 |
if (!pes->st) {
|
678 |
pes->st = av_new_stream(ts->stream, pes->pid); |
679 |
if (!pes->st)
|
680 |
return AVERROR(ENOMEM);
|
681 |
mpegts_set_stream_info(pes->st, pes, 0, 0); |
682 |
} |
683 |
|
684 |
pes->total_size = AV_RB16(pes->header + 4);
|
685 |
/* NOTE: a zero total size means the PES size is
|
686 |
unbounded */
|
687 |
if (!pes->total_size)
|
688 |
pes->total_size = MAX_PES_PAYLOAD; |
689 |
|
690 |
/* allocate pes buffer */
|
691 |
pes->buffer = av_malloc(pes->total_size+FF_INPUT_BUFFER_PADDING_SIZE); |
692 |
if (!pes->buffer)
|
693 |
return AVERROR(ENOMEM);
|
694 |
|
695 |
if (code != 0x1bc && code != 0x1bf && /* program_stream_map, private_stream_2 */ |
696 |
code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */ |
697 |
code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */ |
698 |
code != 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */ |
699 |
pes->state = MPEGTS_PESHEADER; |
700 |
if (pes->st->codec->codec_id == CODEC_ID_NONE) {
|
701 |
av_dlog(pes->stream, "pid=%x stream_type=%x probing\n",
|
702 |
pes->pid, pes->stream_type); |
703 |
pes->st->codec->codec_id = CODEC_ID_PROBE; |
704 |
} |
705 |
} else {
|
706 |
pes->state = MPEGTS_PAYLOAD; |
707 |
pes->data_index = 0;
|
708 |
} |
709 |
} else {
|
710 |
/* otherwise, it should be a table */
|
711 |
/* skip packet */
|
712 |
skip:
|
713 |
pes->state = MPEGTS_SKIP; |
714 |
continue;
|
715 |
} |
716 |
} |
717 |
break;
|
718 |
/**********************************************/
|
719 |
/* PES packing parsing */
|
720 |
case MPEGTS_PESHEADER:
|
721 |
len = PES_HEADER_SIZE - pes->data_index; |
722 |
if (len < 0) |
723 |
return -1; |
724 |
if (len > buf_size)
|
725 |
len = buf_size; |
726 |
memcpy(pes->header + pes->data_index, p, len); |
727 |
pes->data_index += len; |
728 |
p += len; |
729 |
buf_size -= len; |
730 |
if (pes->data_index == PES_HEADER_SIZE) {
|
731 |
pes->pes_header_size = pes->header[8] + 9; |
732 |
pes->state = MPEGTS_PESHEADER_FILL; |
733 |
} |
734 |
break;
|
735 |
case MPEGTS_PESHEADER_FILL:
|
736 |
len = pes->pes_header_size - pes->data_index; |
737 |
if (len < 0) |
738 |
return -1; |
739 |
if (len > buf_size)
|
740 |
len = buf_size; |
741 |
memcpy(pes->header + pes->data_index, p, len); |
742 |
pes->data_index += len; |
743 |
p += len; |
744 |
buf_size -= len; |
745 |
if (pes->data_index == pes->pes_header_size) {
|
746 |
const uint8_t *r;
|
747 |
unsigned int flags, pes_ext, skip; |
748 |
|
749 |
flags = pes->header[7];
|
750 |
r = pes->header + 9;
|
751 |
pes->pts = AV_NOPTS_VALUE; |
752 |
pes->dts = AV_NOPTS_VALUE; |
753 |
if ((flags & 0xc0) == 0x80) { |
754 |
pes->dts = pes->pts = ff_parse_pes_pts(r); |
755 |
r += 5;
|
756 |
} else if ((flags & 0xc0) == 0xc0) { |
757 |
pes->pts = ff_parse_pes_pts(r); |
758 |
r += 5;
|
759 |
pes->dts = ff_parse_pes_pts(r); |
760 |
r += 5;
|
761 |
} |
762 |
pes->extended_stream_id = -1;
|
763 |
if (flags & 0x01) { /* PES extension */ |
764 |
pes_ext = *r++; |
765 |
/* Skip PES private data, program packet sequence counter and P-STD buffer */
|
766 |
skip = (pes_ext >> 4) & 0xb; |
767 |
skip += skip & 0x9;
|
768 |
r += skip; |
769 |
if ((pes_ext & 0x41) == 0x01 && |
770 |
(r + 2) <= (pes->header + pes->pes_header_size)) {
|
771 |
/* PES extension 2 */
|
772 |
if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0) |
773 |
pes->extended_stream_id = r[1];
|
774 |
} |
775 |
} |
776 |
|
777 |
/* we got the full header. We parse it and get the payload */
|
778 |
pes->state = MPEGTS_PAYLOAD; |
779 |
pes->data_index = 0;
|
780 |
} |
781 |
break;
|
782 |
case MPEGTS_PAYLOAD:
|
783 |
if (buf_size > 0 && pes->buffer) { |
784 |
if (pes->data_index > 0 && pes->data_index+buf_size > pes->total_size) { |
785 |
new_pes_packet(pes, ts->pkt); |
786 |
pes->total_size = MAX_PES_PAYLOAD; |
787 |
pes->buffer = av_malloc(pes->total_size+FF_INPUT_BUFFER_PADDING_SIZE); |
788 |
if (!pes->buffer)
|
789 |
return AVERROR(ENOMEM);
|
790 |
ts->stop_parse = 1;
|
791 |
} else if (pes->data_index == 0 && buf_size > pes->total_size) { |
792 |
// pes packet size is < ts size packet and pes data is padded with 0xff
|
793 |
// not sure if this is legal in ts but see issue #2392
|
794 |
buf_size = pes->total_size; |
795 |
} |
796 |
memcpy(pes->buffer+pes->data_index, p, buf_size); |
797 |
pes->data_index += buf_size; |
798 |
} |
799 |
buf_size = 0;
|
800 |
/* emit complete packets with known packet size
|
801 |
* decreases demuxer delay for infrequent packets like subtitles from
|
802 |
* a couple of seconds to milliseconds for properly muxed files.
|
803 |
* total_size is the number of bytes following pes_packet_length
|
804 |
* in the pes header, i.e. not counting the first 6 bytes */
|
805 |
if (!ts->stop_parse && pes->total_size < MAX_PES_PAYLOAD &&
|
806 |
pes->pes_header_size + pes->data_index == pes->total_size + 6) {
|
807 |
ts->stop_parse = 1;
|
808 |
new_pes_packet(pes, ts->pkt); |
809 |
} |
810 |
break;
|
811 |
case MPEGTS_SKIP:
|
812 |
buf_size = 0;
|
813 |
break;
|
814 |
} |
815 |
} |
816 |
|
817 |
return 0; |
818 |
} |
819 |
|
820 |
static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid) |
821 |
{ |
822 |
MpegTSFilter *tss; |
823 |
PESContext *pes; |
824 |
|
825 |
/* if no pid found, then add a pid context */
|
826 |
pes = av_mallocz(sizeof(PESContext));
|
827 |
if (!pes)
|
828 |
return 0; |
829 |
pes->ts = ts; |
830 |
pes->stream = ts->stream; |
831 |
pes->pid = pid; |
832 |
pes->pcr_pid = pcr_pid; |
833 |
pes->state = MPEGTS_SKIP; |
834 |
pes->pts = AV_NOPTS_VALUE; |
835 |
pes->dts = AV_NOPTS_VALUE; |
836 |
tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes); |
837 |
if (!tss) {
|
838 |
av_free(pes); |
839 |
return 0; |
840 |
} |
841 |
return pes;
|
842 |
} |
843 |
|
844 |
static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size, |
845 |
int *es_id, uint8_t **dec_config_descr,
|
846 |
int *dec_config_descr_size)
|
847 |
{ |
848 |
AVIOContext pb; |
849 |
int tag;
|
850 |
unsigned len;
|
851 |
|
852 |
ffio_init_context(&pb, buf, size, 0, NULL, NULL, NULL, NULL); |
853 |
|
854 |
len = ff_mp4_read_descr(s, &pb, &tag); |
855 |
if (tag == MP4IODescrTag) {
|
856 |
avio_rb16(&pb); // ID
|
857 |
avio_r8(&pb); |
858 |
avio_r8(&pb); |
859 |
avio_r8(&pb); |
860 |
avio_r8(&pb); |
861 |
avio_r8(&pb); |
862 |
len = ff_mp4_read_descr(s, &pb, &tag); |
863 |
if (tag == MP4ESDescrTag) {
|
864 |
*es_id = avio_rb16(&pb); /* ES_ID */
|
865 |
av_dlog(s, "ES_ID %#x\n", *es_id);
|
866 |
avio_r8(&pb); /* priority */
|
867 |
len = ff_mp4_read_descr(s, &pb, &tag); |
868 |
if (tag == MP4DecConfigDescrTag) {
|
869 |
*dec_config_descr = av_malloc(len); |
870 |
if (!*dec_config_descr)
|
871 |
return AVERROR(ENOMEM);
|
872 |
*dec_config_descr_size = len; |
873 |
avio_read(&pb, *dec_config_descr, len); |
874 |
} |
875 |
} |
876 |
} |
877 |
return 0; |
878 |
} |
879 |
|
880 |
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, |
881 |
const uint8_t **pp, const uint8_t *desc_list_end, |
882 |
int mp4_dec_config_descr_len, int mp4_es_id, int pid, |
883 |
uint8_t *mp4_dec_config_descr) |
884 |
{ |
885 |
const uint8_t *desc_end;
|
886 |
int desc_len, desc_tag;
|
887 |
char language[252]; |
888 |
int i;
|
889 |
|
890 |
desc_tag = get8(pp, desc_list_end); |
891 |
if (desc_tag < 0) |
892 |
return -1; |
893 |
desc_len = get8(pp, desc_list_end); |
894 |
if (desc_len < 0) |
895 |
return -1; |
896 |
desc_end = *pp + desc_len; |
897 |
if (desc_end > desc_list_end)
|
898 |
return -1; |
899 |
|
900 |
av_dlog(fc, "tag: 0x%02x len=%d\n", desc_tag, desc_len);
|
901 |
|
902 |
if (st->codec->codec_id == CODEC_ID_NONE &&
|
903 |
stream_type == STREAM_TYPE_PRIVATE_DATA) |
904 |
mpegts_find_stream_type(st, desc_tag, DESC_types); |
905 |
|
906 |
switch(desc_tag) {
|
907 |
case 0x1F: /* FMC descriptor */ |
908 |
get16(pp, desc_end); |
909 |
if (st->codec->codec_id == CODEC_ID_AAC_LATM &&
|
910 |
mp4_dec_config_descr_len && mp4_es_id == pid) { |
911 |
AVIOContext pb; |
912 |
ffio_init_context(&pb, mp4_dec_config_descr, |
913 |
mp4_dec_config_descr_len, 0, NULL, NULL, NULL, NULL); |
914 |
ff_mp4_read_dec_config_descr(fc, st, &pb); |
915 |
if (st->codec->codec_id == CODEC_ID_AAC &&
|
916 |
st->codec->extradata_size > 0)
|
917 |
st->need_parsing = 0;
|
918 |
} |
919 |
break;
|
920 |
case 0x56: /* DVB teletext descriptor */ |
921 |
language[0] = get8(pp, desc_end);
|
922 |
language[1] = get8(pp, desc_end);
|
923 |
language[2] = get8(pp, desc_end);
|
924 |
language[3] = 0; |
925 |
av_metadata_set2(&st->metadata, "language", language, 0); |
926 |
break;
|
927 |
case 0x59: /* subtitling descriptor */ |
928 |
language[0] = get8(pp, desc_end);
|
929 |
language[1] = get8(pp, desc_end);
|
930 |
language[2] = get8(pp, desc_end);
|
931 |
language[3] = 0; |
932 |
/* hearing impaired subtitles detection */
|
933 |
switch(get8(pp, desc_end)) {
|
934 |
case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */ |
935 |
case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */ |
936 |
case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */ |
937 |
case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */ |
938 |
case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */ |
939 |
case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */ |
940 |
st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED; |
941 |
break;
|
942 |
} |
943 |
if (st->codec->extradata) {
|
944 |
if (st->codec->extradata_size == 4 && memcmp(st->codec->extradata, *pp, 4)) |
945 |
av_log_ask_for_sample(fc, "DVB sub with multiple IDs\n");
|
946 |
} else {
|
947 |
st->codec->extradata = av_malloc(4 + FF_INPUT_BUFFER_PADDING_SIZE);
|
948 |
if (st->codec->extradata) {
|
949 |
st->codec->extradata_size = 4;
|
950 |
memcpy(st->codec->extradata, *pp, 4);
|
951 |
} |
952 |
} |
953 |
*pp += 4;
|
954 |
av_metadata_set2(&st->metadata, "language", language, 0); |
955 |
break;
|
956 |
case 0x0a: /* ISO 639 language descriptor */ |
957 |
for (i = 0; i + 4 <= desc_len; i += 4) { |
958 |
language[i + 0] = get8(pp, desc_end);
|
959 |
language[i + 1] = get8(pp, desc_end);
|
960 |
language[i + 2] = get8(pp, desc_end);
|
961 |
language[i + 3] = ','; |
962 |
switch (get8(pp, desc_end)) {
|
963 |
case 0x01: st->disposition |= AV_DISPOSITION_CLEAN_EFFECTS; break; |
964 |
case 0x02: st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED; break; |
965 |
case 0x03: st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED; break; |
966 |
} |
967 |
} |
968 |
if (i) {
|
969 |
language[i - 1] = 0; |
970 |
av_metadata_set2(&st->metadata, "language", language, 0); |
971 |
} |
972 |
break;
|
973 |
case 0x05: /* registration descriptor */ |
974 |
st->codec->codec_tag = bytestream_get_le32(pp); |
975 |
av_dlog(fc, "reg_desc=%.4s\n", (char*)&st->codec->codec_tag); |
976 |
if (st->codec->codec_id == CODEC_ID_NONE &&
|
977 |
stream_type == STREAM_TYPE_PRIVATE_DATA) |
978 |
mpegts_find_stream_type(st, st->codec->codec_tag, REGD_types); |
979 |
break;
|
980 |
default:
|
981 |
break;
|
982 |
} |
983 |
*pp = desc_end; |
984 |
return 0; |
985 |
} |
986 |
|
987 |
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
988 |
{ |
989 |
MpegTSContext *ts = filter->u.section_filter.opaque; |
990 |
SectionHeader h1, *h = &h1; |
991 |
PESContext *pes; |
992 |
AVStream *st; |
993 |
const uint8_t *p, *p_end, *desc_list_end;
|
994 |
int program_info_length, pcr_pid, pid, stream_type;
|
995 |
int desc_list_len;
|
996 |
uint32_t prog_reg_desc = 0; /* registration descriptor */ |
997 |
uint8_t *mp4_dec_config_descr = NULL;
|
998 |
int mp4_dec_config_descr_len = 0; |
999 |
int mp4_es_id = 0; |
1000 |
|
1001 |
#ifdef DEBUG
|
1002 |
av_dlog(ts->stream, "PMT: len %i\n", section_len);
|
1003 |
av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); |
1004 |
#endif
|
1005 |
|
1006 |
p_end = section + section_len - 4;
|
1007 |
p = section; |
1008 |
if (parse_section_header(h, &p, p_end) < 0) |
1009 |
return;
|
1010 |
|
1011 |
av_dlog(ts->stream, "sid=0x%x sec_num=%d/%d\n",
|
1012 |
h->id, h->sec_num, h->last_sec_num); |
1013 |
|
1014 |
if (h->tid != PMT_TID)
|
1015 |
return;
|
1016 |
|
1017 |
clear_program(ts, h->id); |
1018 |
pcr_pid = get16(&p, p_end) & 0x1fff;
|
1019 |
if (pcr_pid < 0) |
1020 |
return;
|
1021 |
add_pid_to_pmt(ts, h->id, pcr_pid); |
1022 |
|
1023 |
av_dlog(ts->stream, "pcr_pid=0x%x\n", pcr_pid);
|
1024 |
|
1025 |
program_info_length = get16(&p, p_end) & 0xfff;
|
1026 |
if (program_info_length < 0) |
1027 |
return;
|
1028 |
while(program_info_length >= 2) { |
1029 |
uint8_t tag, len; |
1030 |
tag = get8(&p, p_end); |
1031 |
len = get8(&p, p_end); |
1032 |
|
1033 |
av_dlog(ts->stream, "program tag: 0x%02x len=%d\n", tag, len);
|
1034 |
|
1035 |
if(len > program_info_length - 2) |
1036 |
//something else is broken, exit the program_descriptors_loop
|
1037 |
break;
|
1038 |
program_info_length -= len + 2;
|
1039 |
if (tag == 0x1d) { // IOD descriptor |
1040 |
get8(&p, p_end); // scope
|
1041 |
get8(&p, p_end); // label
|
1042 |
len -= 2;
|
1043 |
mp4_read_iods(ts->stream, p, len, &mp4_es_id, |
1044 |
&mp4_dec_config_descr, &mp4_dec_config_descr_len); |
1045 |
} else if (tag == 0x05 && len >= 4) { // registration descriptor |
1046 |
prog_reg_desc = bytestream_get_le32(&p); |
1047 |
len -= 4;
|
1048 |
} |
1049 |
p += len; |
1050 |
} |
1051 |
p += program_info_length; |
1052 |
if (p >= p_end)
|
1053 |
goto out;
|
1054 |
|
1055 |
// stop parsing after pmt, we found header
|
1056 |
if (!ts->stream->nb_streams)
|
1057 |
ts->stop_parse = 1;
|
1058 |
|
1059 |
for(;;) {
|
1060 |
st = 0;
|
1061 |
stream_type = get8(&p, p_end); |
1062 |
if (stream_type < 0) |
1063 |
break;
|
1064 |
pid = get16(&p, p_end) & 0x1fff;
|
1065 |
if (pid < 0) |
1066 |
break;
|
1067 |
|
1068 |
/* now create ffmpeg stream */
|
1069 |
if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
|
1070 |
pes = ts->pids[pid]->u.pes_filter.opaque; |
1071 |
if (!pes->st)
|
1072 |
pes->st = av_new_stream(pes->stream, pes->pid); |
1073 |
st = pes->st; |
1074 |
} else {
|
1075 |
if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably |
1076 |
pes = add_pes_stream(ts, pid, pcr_pid); |
1077 |
if (pes)
|
1078 |
st = av_new_stream(pes->stream, pes->pid); |
1079 |
} |
1080 |
|
1081 |
if (!st)
|
1082 |
goto out;
|
1083 |
|
1084 |
if (!pes->stream_type)
|
1085 |
mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc); |
1086 |
|
1087 |
add_pid_to_pmt(ts, h->id, pid); |
1088 |
|
1089 |
ff_program_add_stream_index(ts->stream, h->id, st->index); |
1090 |
|
1091 |
desc_list_len = get16(&p, p_end) & 0xfff;
|
1092 |
if (desc_list_len < 0) |
1093 |
break;
|
1094 |
desc_list_end = p + desc_list_len; |
1095 |
if (desc_list_end > p_end)
|
1096 |
break;
|
1097 |
for(;;) {
|
1098 |
if (ff_parse_mpeg2_descriptor(ts->stream, st, stream_type, &p, desc_list_end,
|
1099 |
mp4_dec_config_descr_len, mp4_es_id, pid, mp4_dec_config_descr) < 0)
|
1100 |
break;
|
1101 |
|
1102 |
if (prog_reg_desc == AV_RL32("HDMV") && stream_type == 0x83 && pes->sub_st) { |
1103 |
ff_program_add_stream_index(ts->stream, h->id, pes->sub_st->index); |
1104 |
pes->sub_st->codec->codec_tag = st->codec->codec_tag; |
1105 |
} |
1106 |
} |
1107 |
p = desc_list_end; |
1108 |
} |
1109 |
|
1110 |
out:
|
1111 |
av_free(mp4_dec_config_descr); |
1112 |
} |
1113 |
|
1114 |
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
1115 |
{ |
1116 |
MpegTSContext *ts = filter->u.section_filter.opaque; |
1117 |
SectionHeader h1, *h = &h1; |
1118 |
const uint8_t *p, *p_end;
|
1119 |
int sid, pmt_pid;
|
1120 |
|
1121 |
#ifdef DEBUG
|
1122 |
av_dlog(ts->stream, "PAT:\n");
|
1123 |
av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); |
1124 |
#endif
|
1125 |
p_end = section + section_len - 4;
|
1126 |
p = section; |
1127 |
if (parse_section_header(h, &p, p_end) < 0) |
1128 |
return;
|
1129 |
if (h->tid != PAT_TID)
|
1130 |
return;
|
1131 |
|
1132 |
clear_programs(ts); |
1133 |
for(;;) {
|
1134 |
sid = get16(&p, p_end); |
1135 |
if (sid < 0) |
1136 |
break;
|
1137 |
pmt_pid = get16(&p, p_end) & 0x1fff;
|
1138 |
if (pmt_pid < 0) |
1139 |
break;
|
1140 |
|
1141 |
av_dlog(ts->stream, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
|
1142 |
|
1143 |
if (sid == 0x0000) { |
1144 |
/* NIT info */
|
1145 |
} else {
|
1146 |
av_new_program(ts->stream, sid); |
1147 |
if (ts->pids[pmt_pid])
|
1148 |
mpegts_close_filter(ts, ts->pids[pmt_pid]); |
1149 |
mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
|
1150 |
add_pat_entry(ts, sid); |
1151 |
add_pid_to_pmt(ts, sid, 0); //add pat pid to program |
1152 |
add_pid_to_pmt(ts, sid, pmt_pid); |
1153 |
} |
1154 |
} |
1155 |
} |
1156 |
|
1157 |
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
1158 |
{ |
1159 |
MpegTSContext *ts = filter->u.section_filter.opaque; |
1160 |
SectionHeader h1, *h = &h1; |
1161 |
const uint8_t *p, *p_end, *desc_list_end, *desc_end;
|
1162 |
int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
|
1163 |
char *name, *provider_name;
|
1164 |
|
1165 |
#ifdef DEBUG
|
1166 |
av_dlog(ts->stream, "SDT:\n");
|
1167 |
av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); |
1168 |
#endif
|
1169 |
|
1170 |
p_end = section + section_len - 4;
|
1171 |
p = section; |
1172 |
if (parse_section_header(h, &p, p_end) < 0) |
1173 |
return;
|
1174 |
if (h->tid != SDT_TID)
|
1175 |
return;
|
1176 |
onid = get16(&p, p_end); |
1177 |
if (onid < 0) |
1178 |
return;
|
1179 |
val = get8(&p, p_end); |
1180 |
if (val < 0) |
1181 |
return;
|
1182 |
for(;;) {
|
1183 |
sid = get16(&p, p_end); |
1184 |
if (sid < 0) |
1185 |
break;
|
1186 |
val = get8(&p, p_end); |
1187 |
if (val < 0) |
1188 |
break;
|
1189 |
desc_list_len = get16(&p, p_end) & 0xfff;
|
1190 |
if (desc_list_len < 0) |
1191 |
break;
|
1192 |
desc_list_end = p + desc_list_len; |
1193 |
if (desc_list_end > p_end)
|
1194 |
break;
|
1195 |
for(;;) {
|
1196 |
desc_tag = get8(&p, desc_list_end); |
1197 |
if (desc_tag < 0) |
1198 |
break;
|
1199 |
desc_len = get8(&p, desc_list_end); |
1200 |
desc_end = p + desc_len; |
1201 |
if (desc_end > desc_list_end)
|
1202 |
break;
|
1203 |
|
1204 |
av_dlog(ts->stream, "tag: 0x%02x len=%d\n",
|
1205 |
desc_tag, desc_len); |
1206 |
|
1207 |
switch(desc_tag) {
|
1208 |
case 0x48: |
1209 |
service_type = get8(&p, p_end); |
1210 |
if (service_type < 0) |
1211 |
break;
|
1212 |
provider_name = getstr8(&p, p_end); |
1213 |
if (!provider_name)
|
1214 |
break;
|
1215 |
name = getstr8(&p, p_end); |
1216 |
if (name) {
|
1217 |
AVProgram *program = av_new_program(ts->stream, sid); |
1218 |
if(program) {
|
1219 |
av_metadata_set2(&program->metadata, "service_name", name, 0); |
1220 |
av_metadata_set2(&program->metadata, "service_provider", provider_name, 0); |
1221 |
} |
1222 |
} |
1223 |
av_free(name); |
1224 |
av_free(provider_name); |
1225 |
break;
|
1226 |
default:
|
1227 |
break;
|
1228 |
} |
1229 |
p = desc_end; |
1230 |
} |
1231 |
p = desc_list_end; |
1232 |
} |
1233 |
} |
1234 |
|
1235 |
/* handle one TS packet */
|
1236 |
static int handle_packet(MpegTSContext *ts, const uint8_t *packet) |
1237 |
{ |
1238 |
AVFormatContext *s = ts->stream; |
1239 |
MpegTSFilter *tss; |
1240 |
int len, pid, cc, cc_ok, afc, is_start;
|
1241 |
const uint8_t *p, *p_end;
|
1242 |
int64_t pos; |
1243 |
|
1244 |
pid = AV_RB16(packet + 1) & 0x1fff; |
1245 |
if(pid && discard_pid(ts, pid))
|
1246 |
return 0; |
1247 |
is_start = packet[1] & 0x40; |
1248 |
tss = ts->pids[pid]; |
1249 |
if (ts->auto_guess && tss == NULL && is_start) { |
1250 |
add_pes_stream(ts, pid, -1);
|
1251 |
tss = ts->pids[pid]; |
1252 |
} |
1253 |
if (!tss)
|
1254 |
return 0; |
1255 |
|
1256 |
/* continuity check (currently not used) */
|
1257 |
cc = (packet[3] & 0xf); |
1258 |
cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc)); |
1259 |
tss->last_cc = cc; |
1260 |
|
1261 |
/* skip adaptation field */
|
1262 |
afc = (packet[3] >> 4) & 3; |
1263 |
p = packet + 4;
|
1264 |
if (afc == 0) /* reserved value */ |
1265 |
return 0; |
1266 |
if (afc == 2) /* adaptation field only */ |
1267 |
return 0; |
1268 |
if (afc == 3) { |
1269 |
/* skip adapation field */
|
1270 |
p += p[0] + 1; |
1271 |
} |
1272 |
/* if past the end of packet, ignore */
|
1273 |
p_end = packet + TS_PACKET_SIZE; |
1274 |
if (p >= p_end)
|
1275 |
return 0; |
1276 |
|
1277 |
pos = avio_tell(ts->stream->pb); |
1278 |
ts->pos47= pos % ts->raw_packet_size; |
1279 |
|
1280 |
if (tss->type == MPEGTS_SECTION) {
|
1281 |
if (is_start) {
|
1282 |
/* pointer field present */
|
1283 |
len = *p++; |
1284 |
if (p + len > p_end)
|
1285 |
return 0; |
1286 |
if (len && cc_ok) {
|
1287 |
/* write remaining section bytes */
|
1288 |
write_section_data(s, tss, |
1289 |
p, len, 0);
|
1290 |
/* check whether filter has been closed */
|
1291 |
if (!ts->pids[pid])
|
1292 |
return 0; |
1293 |
} |
1294 |
p += len; |
1295 |
if (p < p_end) {
|
1296 |
write_section_data(s, tss, |
1297 |
p, p_end - p, 1);
|
1298 |
} |
1299 |
} else {
|
1300 |
if (cc_ok) {
|
1301 |
write_section_data(s, tss, |
1302 |
p, p_end - p, 0);
|
1303 |
} |
1304 |
} |
1305 |
} else {
|
1306 |
int ret;
|
1307 |
// Note: The position here points actually behind the current packet.
|
1308 |
if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
|
1309 |
pos - ts->raw_packet_size)) < 0)
|
1310 |
return ret;
|
1311 |
} |
1312 |
|
1313 |
return 0; |
1314 |
} |
1315 |
|
1316 |
/* XXX: try to find a better synchro over several packets (use
|
1317 |
get_packet_size() ?) */
|
1318 |
static int mpegts_resync(AVFormatContext *s) |
1319 |
{ |
1320 |
AVIOContext *pb = s->pb; |
1321 |
int c, i;
|
1322 |
|
1323 |
for(i = 0;i < MAX_RESYNC_SIZE; i++) { |
1324 |
c = avio_r8(pb); |
1325 |
if (pb->eof_reached)
|
1326 |
return -1; |
1327 |
if (c == 0x47) { |
1328 |
avio_seek(pb, -1, SEEK_CUR);
|
1329 |
return 0; |
1330 |
} |
1331 |
} |
1332 |
av_log(s, AV_LOG_ERROR, "max resync size reached, could not find sync byte\n");
|
1333 |
/* no sync found */
|
1334 |
return -1; |
1335 |
} |
1336 |
|
1337 |
/* return -1 if error or EOF. Return 0 if OK. */
|
1338 |
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size) |
1339 |
{ |
1340 |
AVIOContext *pb = s->pb; |
1341 |
int skip, len;
|
1342 |
|
1343 |
for(;;) {
|
1344 |
len = avio_read(pb, buf, TS_PACKET_SIZE); |
1345 |
if (len != TS_PACKET_SIZE)
|
1346 |
return len < 0 ? len : AVERROR_EOF; |
1347 |
/* check paquet sync byte */
|
1348 |
if (buf[0] != 0x47) { |
1349 |
/* find a new packet start */
|
1350 |
avio_seek(pb, -TS_PACKET_SIZE, SEEK_CUR); |
1351 |
if (mpegts_resync(s) < 0) |
1352 |
return AVERROR(EAGAIN);
|
1353 |
else
|
1354 |
continue;
|
1355 |
} else {
|
1356 |
skip = raw_packet_size - TS_PACKET_SIZE; |
1357 |
if (skip > 0) |
1358 |
avio_skip(pb, skip); |
1359 |
break;
|
1360 |
} |
1361 |
} |
1362 |
return 0; |
1363 |
} |
1364 |
|
1365 |
static int handle_packets(MpegTSContext *ts, int nb_packets) |
1366 |
{ |
1367 |
AVFormatContext *s = ts->stream; |
1368 |
uint8_t packet[TS_PACKET_SIZE]; |
1369 |
int packet_num, ret;
|
1370 |
|
1371 |
ts->stop_parse = 0;
|
1372 |
packet_num = 0;
|
1373 |
for(;;) {
|
1374 |
if (ts->stop_parse>0) |
1375 |
break;
|
1376 |
packet_num++; |
1377 |
if (nb_packets != 0 && packet_num >= nb_packets) |
1378 |
break;
|
1379 |
ret = read_packet(s, packet, ts->raw_packet_size); |
1380 |
if (ret != 0) |
1381 |
return ret;
|
1382 |
ret = handle_packet(ts, packet); |
1383 |
if (ret != 0) |
1384 |
return ret;
|
1385 |
} |
1386 |
return 0; |
1387 |
} |
1388 |
|
1389 |
static int mpegts_probe(AVProbeData *p) |
1390 |
{ |
1391 |
#if 1 |
1392 |
const int size= p->buf_size; |
1393 |
int score, fec_score, dvhs_score;
|
1394 |
int check_count= size / TS_FEC_PACKET_SIZE;
|
1395 |
#define CHECK_COUNT 10 |
1396 |
|
1397 |
if (check_count < CHECK_COUNT)
|
1398 |
return -1; |
1399 |
|
1400 |
score = analyze(p->buf, TS_PACKET_SIZE *check_count, TS_PACKET_SIZE , NULL)*CHECK_COUNT/check_count;
|
1401 |
dvhs_score= analyze(p->buf, TS_DVHS_PACKET_SIZE*check_count, TS_DVHS_PACKET_SIZE, NULL)*CHECK_COUNT/check_count;
|
1402 |
fec_score = analyze(p->buf, TS_FEC_PACKET_SIZE *check_count, TS_FEC_PACKET_SIZE , NULL)*CHECK_COUNT/check_count;
|
1403 |
// av_log(NULL, AV_LOG_DEBUG, "score: %d, dvhs_score: %d, fec_score: %d \n", score, dvhs_score, fec_score);
|
1404 |
|
1405 |
// we need a clear definition for the returned score otherwise things will become messy sooner or later
|
1406 |
if (score > fec_score && score > dvhs_score && score > 6) return AVPROBE_SCORE_MAX + score - CHECK_COUNT; |
1407 |
else if(dvhs_score > score && dvhs_score > fec_score && dvhs_score > 6) return AVPROBE_SCORE_MAX + dvhs_score - CHECK_COUNT; |
1408 |
else if( fec_score > 6) return AVPROBE_SCORE_MAX + fec_score - CHECK_COUNT; |
1409 |
else return -1; |
1410 |
#else
|
1411 |
/* only use the extension for safer guess */
|
1412 |
if (av_match_ext(p->filename, "ts")) |
1413 |
return AVPROBE_SCORE_MAX;
|
1414 |
else
|
1415 |
return 0; |
1416 |
#endif
|
1417 |
} |
1418 |
|
1419 |
/* return the 90kHz PCR and the extension for the 27MHz PCR. return
|
1420 |
(-1) if not available */
|
1421 |
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low, |
1422 |
const uint8_t *packet)
|
1423 |
{ |
1424 |
int afc, len, flags;
|
1425 |
const uint8_t *p;
|
1426 |
unsigned int v; |
1427 |
|
1428 |
afc = (packet[3] >> 4) & 3; |
1429 |
if (afc <= 1) |
1430 |
return -1; |
1431 |
p = packet + 4;
|
1432 |
len = p[0];
|
1433 |
p++; |
1434 |
if (len == 0) |
1435 |
return -1; |
1436 |
flags = *p++; |
1437 |
len--; |
1438 |
if (!(flags & 0x10)) |
1439 |
return -1; |
1440 |
if (len < 6) |
1441 |
return -1; |
1442 |
v = AV_RB32(p); |
1443 |
*ppcr_high = ((int64_t)v << 1) | (p[4] >> 7); |
1444 |
*ppcr_low = ((p[4] & 1) << 8) | p[5]; |
1445 |
return 0; |
1446 |
} |
1447 |
|
1448 |
static int mpegts_read_header(AVFormatContext *s, |
1449 |
AVFormatParameters *ap) |
1450 |
{ |
1451 |
MpegTSContext *ts = s->priv_data; |
1452 |
AVIOContext *pb = s->pb; |
1453 |
uint8_t buf[5*1024]; |
1454 |
int len;
|
1455 |
int64_t pos; |
1456 |
|
1457 |
if (ap) {
|
1458 |
ts->mpeg2ts_compute_pcr = ap->mpeg2ts_compute_pcr; |
1459 |
if(ap->mpeg2ts_raw){
|
1460 |
av_log(s, AV_LOG_ERROR, "use mpegtsraw_demuxer!\n");
|
1461 |
return -1; |
1462 |
} |
1463 |
} |
1464 |
|
1465 |
/* read the first 1024 bytes to get packet size */
|
1466 |
pos = avio_tell(pb); |
1467 |
len = avio_read(pb, buf, sizeof(buf));
|
1468 |
if (len != sizeof(buf)) |
1469 |
goto fail;
|
1470 |
ts->raw_packet_size = get_packet_size(buf, sizeof(buf));
|
1471 |
if (ts->raw_packet_size <= 0) |
1472 |
goto fail;
|
1473 |
ts->stream = s; |
1474 |
ts->auto_guess = 0;
|
1475 |
|
1476 |
if (s->iformat == &ff_mpegts_demuxer) {
|
1477 |
/* normal demux */
|
1478 |
|
1479 |
/* first do a scaning to get all the services */
|
1480 |
if (avio_seek(pb, pos, SEEK_SET) < 0) |
1481 |
av_log(s, AV_LOG_ERROR, "Unable to seek back to the start\n");
|
1482 |
|
1483 |
mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
|
1484 |
|
1485 |
mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
|
1486 |
|
1487 |
handle_packets(ts, s->probesize / ts->raw_packet_size); |
1488 |
/* if could not find service, enable auto_guess */
|
1489 |
|
1490 |
ts->auto_guess = 1;
|
1491 |
|
1492 |
av_dlog(ts->stream, "tuning done\n");
|
1493 |
|
1494 |
s->ctx_flags |= AVFMTCTX_NOHEADER; |
1495 |
} else {
|
1496 |
AVStream *st; |
1497 |
int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
|
1498 |
int64_t pcrs[2], pcr_h;
|
1499 |
int packet_count[2]; |
1500 |
uint8_t packet[TS_PACKET_SIZE]; |
1501 |
|
1502 |
/* only read packets */
|
1503 |
|
1504 |
st = av_new_stream(s, 0);
|
1505 |
if (!st)
|
1506 |
goto fail;
|
1507 |
av_set_pts_info(st, 60, 1, 27000000); |
1508 |
st->codec->codec_type = AVMEDIA_TYPE_DATA; |
1509 |
st->codec->codec_id = CODEC_ID_MPEG2TS; |
1510 |
|
1511 |
/* we iterate until we find two PCRs to estimate the bitrate */
|
1512 |
pcr_pid = -1;
|
1513 |
nb_pcrs = 0;
|
1514 |
nb_packets = 0;
|
1515 |
for(;;) {
|
1516 |
ret = read_packet(s, packet, ts->raw_packet_size); |
1517 |
if (ret < 0) |
1518 |
return -1; |
1519 |
pid = AV_RB16(packet + 1) & 0x1fff; |
1520 |
if ((pcr_pid == -1 || pcr_pid == pid) && |
1521 |
parse_pcr(&pcr_h, &pcr_l, packet) == 0) {
|
1522 |
pcr_pid = pid; |
1523 |
packet_count[nb_pcrs] = nb_packets; |
1524 |
pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
|
1525 |
nb_pcrs++; |
1526 |
if (nb_pcrs >= 2) |
1527 |
break;
|
1528 |
} |
1529 |
nb_packets++; |
1530 |
} |
1531 |
|
1532 |
/* NOTE1: the bitrate is computed without the FEC */
|
1533 |
/* NOTE2: it is only the bitrate of the start of the stream */
|
1534 |
ts->pcr_incr = (pcrs[1] - pcrs[0]) / (packet_count[1] - packet_count[0]); |
1535 |
ts->cur_pcr = pcrs[0] - ts->pcr_incr * packet_count[0]; |
1536 |
s->bit_rate = (TS_PACKET_SIZE * 8) * 27e6 / ts->pcr_incr; |
1537 |
st->codec->bit_rate = s->bit_rate; |
1538 |
st->start_time = ts->cur_pcr; |
1539 |
av_dlog(ts->stream, AV_LOG_DEBUG, "start=%0.3f pcr=%0.3f incr=%d\n",
|
1540 |
st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr); |
1541 |
} |
1542 |
|
1543 |
avio_seek(pb, pos, SEEK_SET); |
1544 |
return 0; |
1545 |
fail:
|
1546 |
return -1; |
1547 |
} |
1548 |
|
1549 |
#define MAX_PACKET_READAHEAD ((128 * 1024) / 188) |
1550 |
|
1551 |
static int mpegts_raw_read_packet(AVFormatContext *s, |
1552 |
AVPacket *pkt) |
1553 |
{ |
1554 |
MpegTSContext *ts = s->priv_data; |
1555 |
int ret, i;
|
1556 |
int64_t pcr_h, next_pcr_h, pos; |
1557 |
int pcr_l, next_pcr_l;
|
1558 |
uint8_t pcr_buf[12];
|
1559 |
|
1560 |
if (av_new_packet(pkt, TS_PACKET_SIZE) < 0) |
1561 |
return AVERROR(ENOMEM);
|
1562 |
pkt->pos= avio_tell(s->pb); |
1563 |
ret = read_packet(s, pkt->data, ts->raw_packet_size); |
1564 |
if (ret < 0) { |
1565 |
av_free_packet(pkt); |
1566 |
return ret;
|
1567 |
} |
1568 |
if (ts->mpeg2ts_compute_pcr) {
|
1569 |
/* compute exact PCR for each packet */
|
1570 |
if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) { |
1571 |
/* we read the next PCR (XXX: optimize it by using a bigger buffer */
|
1572 |
pos = avio_tell(s->pb); |
1573 |
for(i = 0; i < MAX_PACKET_READAHEAD; i++) { |
1574 |
avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET); |
1575 |
avio_read(s->pb, pcr_buf, 12);
|
1576 |
if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) { |
1577 |
/* XXX: not precise enough */
|
1578 |
ts->pcr_incr = ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) /
|
1579 |
(i + 1);
|
1580 |
break;
|
1581 |
} |
1582 |
} |
1583 |
avio_seek(s->pb, pos, SEEK_SET); |
1584 |
/* no next PCR found: we use previous increment */
|
1585 |
ts->cur_pcr = pcr_h * 300 + pcr_l;
|
1586 |
} |
1587 |
pkt->pts = ts->cur_pcr; |
1588 |
pkt->duration = ts->pcr_incr; |
1589 |
ts->cur_pcr += ts->pcr_incr; |
1590 |
} |
1591 |
pkt->stream_index = 0;
|
1592 |
return 0; |
1593 |
} |
1594 |
|
1595 |
static int mpegts_read_packet(AVFormatContext *s, |
1596 |
AVPacket *pkt) |
1597 |
{ |
1598 |
MpegTSContext *ts = s->priv_data; |
1599 |
int ret, i;
|
1600 |
|
1601 |
if (avio_tell(s->pb) != ts->last_pos) {
|
1602 |
/* seek detected, flush pes buffer */
|
1603 |
for (i = 0; i < NB_PID_MAX; i++) { |
1604 |
if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
|
1605 |
PESContext *pes = ts->pids[i]->u.pes_filter.opaque; |
1606 |
av_freep(&pes->buffer); |
1607 |
pes->data_index = 0;
|
1608 |
pes->state = MPEGTS_SKIP; /* skip until pes header */
|
1609 |
} |
1610 |
} |
1611 |
} |
1612 |
|
1613 |
ts->pkt = pkt; |
1614 |
ret = handle_packets(ts, 0);
|
1615 |
if (ret < 0) { |
1616 |
/* flush pes data left */
|
1617 |
for (i = 0; i < NB_PID_MAX; i++) { |
1618 |
if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
|
1619 |
PESContext *pes = ts->pids[i]->u.pes_filter.opaque; |
1620 |
if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) { |
1621 |
new_pes_packet(pes, pkt); |
1622 |
pes->state = MPEGTS_SKIP; |
1623 |
ret = 0;
|
1624 |
break;
|
1625 |
} |
1626 |
} |
1627 |
} |
1628 |
} |
1629 |
|
1630 |
ts->last_pos = avio_tell(s->pb); |
1631 |
|
1632 |
return ret;
|
1633 |
} |
1634 |
|
1635 |
static int mpegts_read_close(AVFormatContext *s) |
1636 |
{ |
1637 |
MpegTSContext *ts = s->priv_data; |
1638 |
int i;
|
1639 |
|
1640 |
clear_programs(ts); |
1641 |
|
1642 |
for(i=0;i<NB_PID_MAX;i++) |
1643 |
if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]);
|
1644 |
|
1645 |
return 0; |
1646 |
} |
1647 |
|
1648 |
static int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, |
1649 |
int64_t *ppos, int64_t pos_limit) |
1650 |
{ |
1651 |
MpegTSContext *ts = s->priv_data; |
1652 |
int64_t pos, timestamp; |
1653 |
uint8_t buf[TS_PACKET_SIZE]; |
1654 |
int pcr_l, pcr_pid = ((PESContext*)s->streams[stream_index]->priv_data)->pcr_pid;
|
1655 |
const int find_next= 1; |
1656 |
pos = ((*ppos + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
|
1657 |
if (find_next) {
|
1658 |
for(;;) {
|
1659 |
avio_seek(s->pb, pos, SEEK_SET); |
1660 |
if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
|
1661 |
return AV_NOPTS_VALUE;
|
1662 |
if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) && |
1663 |
parse_pcr(×tamp, &pcr_l, buf) == 0) {
|
1664 |
break;
|
1665 |
} |
1666 |
pos += ts->raw_packet_size; |
1667 |
} |
1668 |
} else {
|
1669 |
for(;;) {
|
1670 |
pos -= ts->raw_packet_size; |
1671 |
if (pos < 0) |
1672 |
return AV_NOPTS_VALUE;
|
1673 |
avio_seek(s->pb, pos, SEEK_SET); |
1674 |
if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
|
1675 |
return AV_NOPTS_VALUE;
|
1676 |
if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) && |
1677 |
parse_pcr(×tamp, &pcr_l, buf) == 0) {
|
1678 |
break;
|
1679 |
} |
1680 |
} |
1681 |
} |
1682 |
*ppos = pos; |
1683 |
|
1684 |
return timestamp;
|
1685 |
} |
1686 |
|
1687 |
#ifdef USE_SYNCPOINT_SEARCH
|
1688 |
|
1689 |
static int read_seek2(AVFormatContext *s, |
1690 |
int stream_index,
|
1691 |
int64_t min_ts, |
1692 |
int64_t target_ts, |
1693 |
int64_t max_ts, |
1694 |
int flags)
|
1695 |
{ |
1696 |
int64_t pos; |
1697 |
|
1698 |
int64_t ts_ret, ts_adj; |
1699 |
int stream_index_gen_search;
|
1700 |
AVStream *st; |
1701 |
AVParserState *backup; |
1702 |
|
1703 |
backup = ff_store_parser_state(s); |
1704 |
|
1705 |
// detect direction of seeking for search purposes
|
1706 |
flags |= (target_ts - min_ts > (uint64_t)(max_ts - target_ts)) ? |
1707 |
AVSEEK_FLAG_BACKWARD : 0;
|
1708 |
|
1709 |
if (flags & AVSEEK_FLAG_BYTE) {
|
1710 |
// use position directly, we will search starting from it
|
1711 |
pos = target_ts; |
1712 |
} else {
|
1713 |
// search for some position with good timestamp match
|
1714 |
if (stream_index < 0) { |
1715 |
stream_index_gen_search = av_find_default_stream_index(s); |
1716 |
if (stream_index_gen_search < 0) { |
1717 |
ff_restore_parser_state(s, backup); |
1718 |
return -1; |
1719 |
} |
1720 |
|
1721 |
st = s->streams[stream_index_gen_search]; |
1722 |
// timestamp for default must be expressed in AV_TIME_BASE units
|
1723 |
ts_adj = av_rescale(target_ts, |
1724 |
st->time_base.den, |
1725 |
AV_TIME_BASE * (int64_t)st->time_base.num); |
1726 |
} else {
|
1727 |
ts_adj = target_ts; |
1728 |
stream_index_gen_search = stream_index; |
1729 |
} |
1730 |
pos = av_gen_search(s, stream_index_gen_search, ts_adj, |
1731 |
0, INT64_MAX, -1, |
1732 |
AV_NOPTS_VALUE, |
1733 |
AV_NOPTS_VALUE, |
1734 |
flags, &ts_ret, mpegts_get_pcr); |
1735 |
if (pos < 0) { |
1736 |
ff_restore_parser_state(s, backup); |
1737 |
return -1; |
1738 |
} |
1739 |
} |
1740 |
|
1741 |
// search for actual matching keyframe/starting position for all streams
|
1742 |
if (ff_gen_syncpoint_search(s, stream_index, pos,
|
1743 |
min_ts, target_ts, max_ts, |
1744 |
flags) < 0) {
|
1745 |
ff_restore_parser_state(s, backup); |
1746 |
return -1; |
1747 |
} |
1748 |
|
1749 |
ff_free_parser_state(s, backup); |
1750 |
return 0; |
1751 |
} |
1752 |
|
1753 |
static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags) |
1754 |
{ |
1755 |
int ret;
|
1756 |
if (flags & AVSEEK_FLAG_BACKWARD) {
|
1757 |
flags &= ~AVSEEK_FLAG_BACKWARD; |
1758 |
ret = read_seek2(s, stream_index, INT64_MIN, target_ts, target_ts, flags); |
1759 |
if (ret < 0) |
1760 |
// for compatibility reasons, seek to the best-fitting timestamp
|
1761 |
ret = read_seek2(s, stream_index, INT64_MIN, target_ts, INT64_MAX, flags); |
1762 |
} else {
|
1763 |
ret = read_seek2(s, stream_index, target_ts, target_ts, INT64_MAX, flags); |
1764 |
if (ret < 0) |
1765 |
// for compatibility reasons, seek to the best-fitting timestamp
|
1766 |
ret = read_seek2(s, stream_index, INT64_MIN, target_ts, INT64_MAX, flags); |
1767 |
} |
1768 |
return ret;
|
1769 |
} |
1770 |
|
1771 |
#else
|
1772 |
|
1773 |
static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){ |
1774 |
MpegTSContext *ts = s->priv_data; |
1775 |
uint8_t buf[TS_PACKET_SIZE]; |
1776 |
int64_t pos; |
1777 |
|
1778 |
if(av_seek_frame_binary(s, stream_index, target_ts, flags) < 0) |
1779 |
return -1; |
1780 |
|
1781 |
pos= avio_tell(s->pb); |
1782 |
|
1783 |
for(;;) {
|
1784 |
avio_seek(s->pb, pos, SEEK_SET); |
1785 |
if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
|
1786 |
return -1; |
1787 |
// pid = AV_RB16(buf + 1) & 0x1fff;
|
1788 |
if(buf[1] & 0x40) break; |
1789 |
pos += ts->raw_packet_size; |
1790 |
} |
1791 |
avio_seek(s->pb, pos, SEEK_SET); |
1792 |
|
1793 |
return 0; |
1794 |
} |
1795 |
|
1796 |
#endif
|
1797 |
|
1798 |
/**************************************************************/
|
1799 |
/* parsing functions - called from other demuxers such as RTP */
|
1800 |
|
1801 |
MpegTSContext *ff_mpegts_parse_open(AVFormatContext *s) |
1802 |
{ |
1803 |
MpegTSContext *ts; |
1804 |
|
1805 |
ts = av_mallocz(sizeof(MpegTSContext));
|
1806 |
if (!ts)
|
1807 |
return NULL; |
1808 |
/* no stream case, currently used by RTP */
|
1809 |
ts->raw_packet_size = TS_PACKET_SIZE; |
1810 |
ts->stream = s; |
1811 |
ts->auto_guess = 1;
|
1812 |
return ts;
|
1813 |
} |
1814 |
|
1815 |
/* return the consumed length if a packet was output, or -1 if no
|
1816 |
packet is output */
|
1817 |
int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
|
1818 |
const uint8_t *buf, int len) |
1819 |
{ |
1820 |
int len1;
|
1821 |
|
1822 |
len1 = len; |
1823 |
ts->pkt = pkt; |
1824 |
ts->stop_parse = 0;
|
1825 |
for(;;) {
|
1826 |
if (ts->stop_parse>0) |
1827 |
break;
|
1828 |
if (len < TS_PACKET_SIZE)
|
1829 |
return -1; |
1830 |
if (buf[0] != 0x47) { |
1831 |
buf++; |
1832 |
len--; |
1833 |
} else {
|
1834 |
handle_packet(ts, buf); |
1835 |
buf += TS_PACKET_SIZE; |
1836 |
len -= TS_PACKET_SIZE; |
1837 |
} |
1838 |
} |
1839 |
return len1 - len;
|
1840 |
} |
1841 |
|
1842 |
void ff_mpegts_parse_close(MpegTSContext *ts)
|
1843 |
{ |
1844 |
int i;
|
1845 |
|
1846 |
for(i=0;i<NB_PID_MAX;i++) |
1847 |
av_free(ts->pids[i]); |
1848 |
av_free(ts); |
1849 |
} |
1850 |
|
1851 |
AVInputFormat ff_mpegts_demuxer = { |
1852 |
"mpegts",
|
1853 |
NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
|
1854 |
sizeof(MpegTSContext),
|
1855 |
mpegts_probe, |
1856 |
mpegts_read_header, |
1857 |
mpegts_read_packet, |
1858 |
mpegts_read_close, |
1859 |
read_seek, |
1860 |
mpegts_get_pcr, |
1861 |
.flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT, |
1862 |
#ifdef USE_SYNCPOINT_SEARCH
|
1863 |
.read_seek2 = read_seek2, |
1864 |
#endif
|
1865 |
}; |
1866 |
|
1867 |
AVInputFormat ff_mpegtsraw_demuxer = { |
1868 |
"mpegtsraw",
|
1869 |
NULL_IF_CONFIG_SMALL("MPEG-2 raw transport stream format"),
|
1870 |
sizeof(MpegTSContext),
|
1871 |
NULL,
|
1872 |
mpegts_read_header, |
1873 |
mpegts_raw_read_packet, |
1874 |
mpegts_read_close, |
1875 |
read_seek, |
1876 |
mpegts_get_pcr, |
1877 |
.flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT, |
1878 |
#ifdef USE_SYNCPOINT_SEARCH
|
1879 |
.read_seek2 = read_seek2, |
1880 |
#endif
|
1881 |
}; |