annotate ffmpeg/libavformat/mpegts.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * MPEG2 transport stream (aka DVB) demuxer
yading@11 3 * Copyright (c) 2002-2003 Fabrice Bellard
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 #include "libavutil/buffer.h"
yading@11 23 #include "libavutil/crc.h"
yading@11 24 #include "libavutil/intreadwrite.h"
yading@11 25 #include "libavutil/log.h"
yading@11 26 #include "libavutil/dict.h"
yading@11 27 #include "libavutil/mathematics.h"
yading@11 28 #include "libavutil/opt.h"
yading@11 29 #include "libavutil/avassert.h"
yading@11 30 #include "libavcodec/bytestream.h"
yading@11 31 #include "libavcodec/get_bits.h"
yading@11 32 #include "avformat.h"
yading@11 33 #include "mpegts.h"
yading@11 34 #include "internal.h"
yading@11 35 #include "avio_internal.h"
yading@11 36 #include "seek.h"
yading@11 37 #include "mpeg.h"
yading@11 38 #include "isom.h"
yading@11 39
yading@11 40 /* maximum size in which we look for synchronisation if
yading@11 41 synchronisation is lost */
yading@11 42 #define MAX_RESYNC_SIZE 65536
yading@11 43
yading@11 44 #define MAX_PES_PAYLOAD 200*1024
yading@11 45
yading@11 46 #define MAX_MP4_DESCR_COUNT 16
yading@11 47
yading@11 48 enum MpegTSFilterType {
yading@11 49 MPEGTS_PES,
yading@11 50 MPEGTS_SECTION,
yading@11 51 };
yading@11 52
yading@11 53 typedef struct MpegTSFilter MpegTSFilter;
yading@11 54
yading@11 55 typedef int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos);
yading@11 56
yading@11 57 typedef struct MpegTSPESFilter {
yading@11 58 PESCallback *pes_cb;
yading@11 59 void *opaque;
yading@11 60 } MpegTSPESFilter;
yading@11 61
yading@11 62 typedef void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len);
yading@11 63
yading@11 64 typedef void SetServiceCallback(void *opaque, int ret);
yading@11 65
yading@11 66 typedef struct MpegTSSectionFilter {
yading@11 67 int section_index;
yading@11 68 int section_h_size;
yading@11 69 uint8_t *section_buf;
yading@11 70 unsigned int check_crc:1;
yading@11 71 unsigned int end_of_section_reached:1;
yading@11 72 SectionCallback *section_cb;
yading@11 73 void *opaque;
yading@11 74 } MpegTSSectionFilter;
yading@11 75
yading@11 76 struct MpegTSFilter {
yading@11 77 int pid;
yading@11 78 int es_id;
yading@11 79 int last_cc; /* last cc code (-1 if first packet) */
yading@11 80 enum MpegTSFilterType type;
yading@11 81 union {
yading@11 82 MpegTSPESFilter pes_filter;
yading@11 83 MpegTSSectionFilter section_filter;
yading@11 84 } u;
yading@11 85 };
yading@11 86
yading@11 87 #define MAX_PIDS_PER_PROGRAM 64
yading@11 88 struct Program {
yading@11 89 unsigned int id; //program id/service id
yading@11 90 unsigned int nb_pids;
yading@11 91 unsigned int pids[MAX_PIDS_PER_PROGRAM];
yading@11 92 };
yading@11 93
yading@11 94 struct MpegTSContext {
yading@11 95 const AVClass *class;
yading@11 96 /* user data */
yading@11 97 AVFormatContext *stream;
yading@11 98 /** raw packet size, including FEC if present */
yading@11 99 int raw_packet_size;
yading@11 100
yading@11 101 int pos47;
yading@11 102
yading@11 103 /** if true, all pids are analyzed to find streams */
yading@11 104 int auto_guess;
yading@11 105
yading@11 106 /** compute exact PCR for each transport stream packet */
yading@11 107 int mpeg2ts_compute_pcr;
yading@11 108
yading@11 109 int64_t cur_pcr; /**< used to estimate the exact PCR */
yading@11 110 int pcr_incr; /**< used to estimate the exact PCR */
yading@11 111
yading@11 112 /* data needed to handle file based ts */
yading@11 113 /** stop parsing loop */
yading@11 114 int stop_parse;
yading@11 115 /** packet containing Audio/Video data */
yading@11 116 AVPacket *pkt;
yading@11 117 /** to detect seek */
yading@11 118 int64_t last_pos;
yading@11 119
yading@11 120 /******************************************/
yading@11 121 /* private mpegts data */
yading@11 122 /* scan context */
yading@11 123 /** structure to keep track of Program->pids mapping */
yading@11 124 unsigned int nb_prg;
yading@11 125 struct Program *prg;
yading@11 126
yading@11 127 int8_t crc_validity[NB_PID_MAX];
yading@11 128
yading@11 129 /** filters for various streams specified by PMT + for the PAT and PMT */
yading@11 130 MpegTSFilter *pids[NB_PID_MAX];
yading@11 131 int current_pid;
yading@11 132 };
yading@11 133
yading@11 134 static const AVOption options[] = {
yading@11 135 {"compute_pcr", "Compute exact PCR for each transport stream packet.", offsetof(MpegTSContext, mpeg2ts_compute_pcr), AV_OPT_TYPE_INT,
yading@11 136 {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
yading@11 137 { NULL },
yading@11 138 };
yading@11 139
yading@11 140 static const AVClass mpegtsraw_class = {
yading@11 141 .class_name = "mpegtsraw demuxer",
yading@11 142 .item_name = av_default_item_name,
yading@11 143 .option = options,
yading@11 144 .version = LIBAVUTIL_VERSION_INT,
yading@11 145 };
yading@11 146
yading@11 147 /* TS stream handling */
yading@11 148
yading@11 149 enum MpegTSState {
yading@11 150 MPEGTS_HEADER = 0,
yading@11 151 MPEGTS_PESHEADER,
yading@11 152 MPEGTS_PESHEADER_FILL,
yading@11 153 MPEGTS_PAYLOAD,
yading@11 154 MPEGTS_SKIP,
yading@11 155 };
yading@11 156
yading@11 157 /* enough for PES header + length */
yading@11 158 #define PES_START_SIZE 6
yading@11 159 #define PES_HEADER_SIZE 9
yading@11 160 #define MAX_PES_HEADER_SIZE (9 + 255)
yading@11 161
yading@11 162 typedef struct PESContext {
yading@11 163 int pid;
yading@11 164 int pcr_pid; /**< if -1 then all packets containing PCR are considered */
yading@11 165 int stream_type;
yading@11 166 MpegTSContext *ts;
yading@11 167 AVFormatContext *stream;
yading@11 168 AVStream *st;
yading@11 169 AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
yading@11 170 enum MpegTSState state;
yading@11 171 /* used to get the format */
yading@11 172 int data_index;
yading@11 173 int flags; /**< copied to the AVPacket flags */
yading@11 174 int total_size;
yading@11 175 int pes_header_size;
yading@11 176 int extended_stream_id;
yading@11 177 int64_t pts, dts;
yading@11 178 int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
yading@11 179 uint8_t header[MAX_PES_HEADER_SIZE];
yading@11 180 AVBufferRef *buffer;
yading@11 181 SLConfigDescr sl;
yading@11 182 } PESContext;
yading@11 183
yading@11 184 extern AVInputFormat ff_mpegts_demuxer;
yading@11 185
yading@11 186 static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
yading@11 187 {
yading@11 188 AVProgram *prg = NULL;
yading@11 189 int i;
yading@11 190 for(i=0; i<ts->stream->nb_programs; i++)
yading@11 191 if(ts->stream->programs[i]->id == programid){
yading@11 192 prg = ts->stream->programs[i];
yading@11 193 break;
yading@11 194 }
yading@11 195 if (!prg)
yading@11 196 return;
yading@11 197 prg->nb_stream_indexes = 0;
yading@11 198 }
yading@11 199
yading@11 200 static void clear_program(MpegTSContext *ts, unsigned int programid)
yading@11 201 {
yading@11 202 int i;
yading@11 203
yading@11 204 clear_avprogram(ts, programid);
yading@11 205 for(i=0; i<ts->nb_prg; i++)
yading@11 206 if(ts->prg[i].id == programid)
yading@11 207 ts->prg[i].nb_pids = 0;
yading@11 208 }
yading@11 209
yading@11 210 static void clear_programs(MpegTSContext *ts)
yading@11 211 {
yading@11 212 av_freep(&ts->prg);
yading@11 213 ts->nb_prg=0;
yading@11 214 }
yading@11 215
yading@11 216 static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
yading@11 217 {
yading@11 218 struct Program *p;
yading@11 219 void *tmp = av_realloc(ts->prg, (ts->nb_prg+1)*sizeof(struct Program));
yading@11 220 if(!tmp)
yading@11 221 return;
yading@11 222 ts->prg = tmp;
yading@11 223 p = &ts->prg[ts->nb_prg];
yading@11 224 p->id = programid;
yading@11 225 p->nb_pids = 0;
yading@11 226 ts->nb_prg++;
yading@11 227 }
yading@11 228
yading@11 229 static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid)
yading@11 230 {
yading@11 231 int i;
yading@11 232 struct Program *p = NULL;
yading@11 233 for(i=0; i<ts->nb_prg; i++) {
yading@11 234 if(ts->prg[i].id == programid) {
yading@11 235 p = &ts->prg[i];
yading@11 236 break;
yading@11 237 }
yading@11 238 }
yading@11 239 if(!p)
yading@11 240 return;
yading@11 241
yading@11 242 if(p->nb_pids >= MAX_PIDS_PER_PROGRAM)
yading@11 243 return;
yading@11 244 p->pids[p->nb_pids++] = pid;
yading@11 245 }
yading@11 246
yading@11 247 static void set_pcr_pid(AVFormatContext *s, unsigned int programid, unsigned int pid)
yading@11 248 {
yading@11 249 int i;
yading@11 250 for(i=0; i<s->nb_programs; i++) {
yading@11 251 if(s->programs[i]->id == programid) {
yading@11 252 s->programs[i]->pcr_pid = pid;
yading@11 253 break;
yading@11 254 }
yading@11 255 }
yading@11 256 }
yading@11 257
yading@11 258 /**
yading@11 259 * @brief discard_pid() decides if the pid is to be discarded according
yading@11 260 * to caller's programs selection
yading@11 261 * @param ts : - TS context
yading@11 262 * @param pid : - pid
yading@11 263 * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
yading@11 264 * 0 otherwise
yading@11 265 */
yading@11 266 static int discard_pid(MpegTSContext *ts, unsigned int pid)
yading@11 267 {
yading@11 268 int i, j, k;
yading@11 269 int used = 0, discarded = 0;
yading@11 270 struct Program *p;
yading@11 271 for(i=0; i<ts->nb_prg; i++) {
yading@11 272 p = &ts->prg[i];
yading@11 273 for(j=0; j<p->nb_pids; j++) {
yading@11 274 if(p->pids[j] != pid)
yading@11 275 continue;
yading@11 276 //is program with id p->id set to be discarded?
yading@11 277 for(k=0; k<ts->stream->nb_programs; k++) {
yading@11 278 if(ts->stream->programs[k]->id == p->id) {
yading@11 279 if(ts->stream->programs[k]->discard == AVDISCARD_ALL)
yading@11 280 discarded++;
yading@11 281 else
yading@11 282 used++;
yading@11 283 }
yading@11 284 }
yading@11 285 }
yading@11 286 }
yading@11 287
yading@11 288 return !used && discarded;
yading@11 289 }
yading@11 290
yading@11 291 /**
yading@11 292 * Assemble PES packets out of TS packets, and then call the "section_cb"
yading@11 293 * function when they are complete.
yading@11 294 */
yading@11 295 static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1,
yading@11 296 const uint8_t *buf, int buf_size, int is_start)
yading@11 297 {
yading@11 298 MpegTSContext *ts = s->priv_data;
yading@11 299 MpegTSSectionFilter *tss = &tss1->u.section_filter;
yading@11 300 int len;
yading@11 301
yading@11 302 if (is_start) {
yading@11 303 memcpy(tss->section_buf, buf, buf_size);
yading@11 304 tss->section_index = buf_size;
yading@11 305 tss->section_h_size = -1;
yading@11 306 tss->end_of_section_reached = 0;
yading@11 307 } else {
yading@11 308 if (tss->end_of_section_reached)
yading@11 309 return;
yading@11 310 len = 4096 - tss->section_index;
yading@11 311 if (buf_size < len)
yading@11 312 len = buf_size;
yading@11 313 memcpy(tss->section_buf + tss->section_index, buf, len);
yading@11 314 tss->section_index += len;
yading@11 315 }
yading@11 316
yading@11 317 /* compute section length if possible */
yading@11 318 if (tss->section_h_size == -1 && tss->section_index >= 3) {
yading@11 319 len = (AV_RB16(tss->section_buf + 1) & 0xfff) + 3;
yading@11 320 if (len > 4096)
yading@11 321 return;
yading@11 322 tss->section_h_size = len;
yading@11 323 }
yading@11 324
yading@11 325 if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) {
yading@11 326 int crc_valid = 1;
yading@11 327 tss->end_of_section_reached = 1;
yading@11 328
yading@11 329 if (tss->check_crc){
yading@11 330 crc_valid = !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, tss->section_buf, tss->section_h_size);
yading@11 331 if (crc_valid){
yading@11 332 ts->crc_validity[ tss1->pid ] = 100;
yading@11 333 }else if(ts->crc_validity[ tss1->pid ] > -10){
yading@11 334 ts->crc_validity[ tss1->pid ]--;
yading@11 335 }else
yading@11 336 crc_valid = 2;
yading@11 337 }
yading@11 338 if (crc_valid)
yading@11 339 tss->section_cb(tss1, tss->section_buf, tss->section_h_size);
yading@11 340 }
yading@11 341 }
yading@11 342
yading@11 343 static MpegTSFilter *mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid,
yading@11 344 SectionCallback *section_cb, void *opaque,
yading@11 345 int check_crc)
yading@11 346
yading@11 347 {
yading@11 348 MpegTSFilter *filter;
yading@11 349 MpegTSSectionFilter *sec;
yading@11 350
yading@11 351 av_dlog(ts->stream, "Filter: pid=0x%x\n", pid);
yading@11 352
yading@11 353 if (pid >= NB_PID_MAX || ts->pids[pid])
yading@11 354 return NULL;
yading@11 355 filter = av_mallocz(sizeof(MpegTSFilter));
yading@11 356 if (!filter)
yading@11 357 return NULL;
yading@11 358 ts->pids[pid] = filter;
yading@11 359 filter->type = MPEGTS_SECTION;
yading@11 360 filter->pid = pid;
yading@11 361 filter->es_id = -1;
yading@11 362 filter->last_cc = -1;
yading@11 363 sec = &filter->u.section_filter;
yading@11 364 sec->section_cb = section_cb;
yading@11 365 sec->opaque = opaque;
yading@11 366 sec->section_buf = av_malloc(MAX_SECTION_SIZE);
yading@11 367 sec->check_crc = check_crc;
yading@11 368 if (!sec->section_buf) {
yading@11 369 av_free(filter);
yading@11 370 return NULL;
yading@11 371 }
yading@11 372 return filter;
yading@11 373 }
yading@11 374
yading@11 375 static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid,
yading@11 376 PESCallback *pes_cb,
yading@11 377 void *opaque)
yading@11 378 {
yading@11 379 MpegTSFilter *filter;
yading@11 380 MpegTSPESFilter *pes;
yading@11 381
yading@11 382 if (pid >= NB_PID_MAX || ts->pids[pid])
yading@11 383 return NULL;
yading@11 384 filter = av_mallocz(sizeof(MpegTSFilter));
yading@11 385 if (!filter)
yading@11 386 return NULL;
yading@11 387 ts->pids[pid] = filter;
yading@11 388 filter->type = MPEGTS_PES;
yading@11 389 filter->pid = pid;
yading@11 390 filter->es_id = -1;
yading@11 391 filter->last_cc = -1;
yading@11 392 pes = &filter->u.pes_filter;
yading@11 393 pes->pes_cb = pes_cb;
yading@11 394 pes->opaque = opaque;
yading@11 395 return filter;
yading@11 396 }
yading@11 397
yading@11 398 static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
yading@11 399 {
yading@11 400 int pid;
yading@11 401
yading@11 402 pid = filter->pid;
yading@11 403 if (filter->type == MPEGTS_SECTION)
yading@11 404 av_freep(&filter->u.section_filter.section_buf);
yading@11 405 else if (filter->type == MPEGTS_PES) {
yading@11 406 PESContext *pes = filter->u.pes_filter.opaque;
yading@11 407 av_buffer_unref(&pes->buffer);
yading@11 408 /* referenced private data will be freed later in
yading@11 409 * avformat_close_input */
yading@11 410 if (!((PESContext *)filter->u.pes_filter.opaque)->st) {
yading@11 411 av_freep(&filter->u.pes_filter.opaque);
yading@11 412 }
yading@11 413 }
yading@11 414
yading@11 415 av_free(filter);
yading@11 416 ts->pids[pid] = NULL;
yading@11 417 }
yading@11 418
yading@11 419 static int analyze(const uint8_t *buf, int size, int packet_size, int *index){
yading@11 420 int stat[TS_MAX_PACKET_SIZE];
yading@11 421 int i;
yading@11 422 int x=0;
yading@11 423 int best_score=0;
yading@11 424
yading@11 425 memset(stat, 0, packet_size*sizeof(int));
yading@11 426
yading@11 427 for(x=i=0; i<size-3; i++){
yading@11 428 if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && buf[i+3] != 0x47){
yading@11 429 stat[x]++;
yading@11 430 if(stat[x] > best_score){
yading@11 431 best_score= stat[x];
yading@11 432 if(index) *index= x;
yading@11 433 }
yading@11 434 }
yading@11 435
yading@11 436 x++;
yading@11 437 if(x == packet_size) x= 0;
yading@11 438 }
yading@11 439
yading@11 440 return best_score;
yading@11 441 }
yading@11 442
yading@11 443 /* autodetect fec presence. Must have at least 1024 bytes */
yading@11 444 static int get_packet_size(const uint8_t *buf, int size)
yading@11 445 {
yading@11 446 int score, fec_score, dvhs_score;
yading@11 447
yading@11 448 if (size < (TS_FEC_PACKET_SIZE * 5 + 1))
yading@11 449 return -1;
yading@11 450
yading@11 451 score = analyze(buf, size, TS_PACKET_SIZE, NULL);
yading@11 452 dvhs_score = analyze(buf, size, TS_DVHS_PACKET_SIZE, NULL);
yading@11 453 fec_score= analyze(buf, size, TS_FEC_PACKET_SIZE, NULL);
yading@11 454 av_dlog(NULL, "score: %d, dvhs_score: %d, fec_score: %d \n",
yading@11 455 score, dvhs_score, fec_score);
yading@11 456
yading@11 457 if (score > fec_score && score > dvhs_score) return TS_PACKET_SIZE;
yading@11 458 else if(dvhs_score > score && dvhs_score > fec_score) return TS_DVHS_PACKET_SIZE;
yading@11 459 else if(score < fec_score && dvhs_score < fec_score) return TS_FEC_PACKET_SIZE;
yading@11 460 else return -1;
yading@11 461 }
yading@11 462
yading@11 463 typedef struct SectionHeader {
yading@11 464 uint8_t tid;
yading@11 465 uint16_t id;
yading@11 466 uint8_t version;
yading@11 467 uint8_t sec_num;
yading@11 468 uint8_t last_sec_num;
yading@11 469 } SectionHeader;
yading@11 470
yading@11 471 static inline int get8(const uint8_t **pp, const uint8_t *p_end)
yading@11 472 {
yading@11 473 const uint8_t *p;
yading@11 474 int c;
yading@11 475
yading@11 476 p = *pp;
yading@11 477 if (p >= p_end)
yading@11 478 return -1;
yading@11 479 c = *p++;
yading@11 480 *pp = p;
yading@11 481 return c;
yading@11 482 }
yading@11 483
yading@11 484 static inline int get16(const uint8_t **pp, const uint8_t *p_end)
yading@11 485 {
yading@11 486 const uint8_t *p;
yading@11 487 int c;
yading@11 488
yading@11 489 p = *pp;
yading@11 490 if ((p + 1) >= p_end)
yading@11 491 return -1;
yading@11 492 c = AV_RB16(p);
yading@11 493 p += 2;
yading@11 494 *pp = p;
yading@11 495 return c;
yading@11 496 }
yading@11 497
yading@11 498 /* read and allocate a DVB string preceded by its length */
yading@11 499 static char *getstr8(const uint8_t **pp, const uint8_t *p_end)
yading@11 500 {
yading@11 501 int len;
yading@11 502 const uint8_t *p;
yading@11 503 char *str;
yading@11 504
yading@11 505 p = *pp;
yading@11 506 len = get8(&p, p_end);
yading@11 507 if (len < 0)
yading@11 508 return NULL;
yading@11 509 if ((p + len) > p_end)
yading@11 510 return NULL;
yading@11 511 str = av_malloc(len + 1);
yading@11 512 if (!str)
yading@11 513 return NULL;
yading@11 514 memcpy(str, p, len);
yading@11 515 str[len] = '\0';
yading@11 516 p += len;
yading@11 517 *pp = p;
yading@11 518 return str;
yading@11 519 }
yading@11 520
yading@11 521 static int parse_section_header(SectionHeader *h,
yading@11 522 const uint8_t **pp, const uint8_t *p_end)
yading@11 523 {
yading@11 524 int val;
yading@11 525
yading@11 526 val = get8(pp, p_end);
yading@11 527 if (val < 0)
yading@11 528 return -1;
yading@11 529 h->tid = val;
yading@11 530 *pp += 2;
yading@11 531 val = get16(pp, p_end);
yading@11 532 if (val < 0)
yading@11 533 return -1;
yading@11 534 h->id = val;
yading@11 535 val = get8(pp, p_end);
yading@11 536 if (val < 0)
yading@11 537 return -1;
yading@11 538 h->version = (val >> 1) & 0x1f;
yading@11 539 val = get8(pp, p_end);
yading@11 540 if (val < 0)
yading@11 541 return -1;
yading@11 542 h->sec_num = val;
yading@11 543 val = get8(pp, p_end);
yading@11 544 if (val < 0)
yading@11 545 return -1;
yading@11 546 h->last_sec_num = val;
yading@11 547 return 0;
yading@11 548 }
yading@11 549
yading@11 550 typedef struct {
yading@11 551 uint32_t stream_type;
yading@11 552 enum AVMediaType codec_type;
yading@11 553 enum AVCodecID codec_id;
yading@11 554 } StreamType;
yading@11 555
yading@11 556 static const StreamType ISO_types[] = {
yading@11 557 { 0x01, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },
yading@11 558 { 0x02, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },
yading@11 559 { 0x03, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3 },
yading@11 560 { 0x04, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3 },
yading@11 561 { 0x0f, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC },
yading@11 562 { 0x10, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG4 },
yading@11 563 /* Makito encoder sets stream type 0x11 for AAC,
yading@11 564 * so auto-detect LOAS/LATM instead of hardcoding it. */
yading@11 565 #if !CONFIG_LOAS_DEMUXER
yading@11 566 { 0x11, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC_LATM }, /* LATM syntax */
yading@11 567 #endif
yading@11 568 { 0x1b, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_H264 },
yading@11 569 { 0x42, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_CAVS },
yading@11 570 { 0xd1, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
yading@11 571 { 0xea, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
yading@11 572 { 0 },
yading@11 573 };
yading@11 574
yading@11 575 static const StreamType HDMV_types[] = {
yading@11 576 { 0x80, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_BLURAY },
yading@11 577 { 0x81, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
yading@11 578 { 0x82, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
yading@11 579 { 0x83, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_TRUEHD },
yading@11 580 { 0x84, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },
yading@11 581 { 0x85, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD */
yading@11 582 { 0x86, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD MASTER*/
yading@11 583 { 0xa1, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC3 Secondary Audio */
yading@11 584 { 0xa2, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS Express Secondary Audio */
yading@11 585 { 0x90, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_HDMV_PGS_SUBTITLE },
yading@11 586 { 0 },
yading@11 587 };
yading@11 588
yading@11 589 /* ATSC ? */
yading@11 590 static const StreamType MISC_types[] = {
yading@11 591 { 0x81, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
yading@11 592 { 0x8a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
yading@11 593 { 0 },
yading@11 594 };
yading@11 595
yading@11 596 static const StreamType REGD_types[] = {
yading@11 597 { MKTAG('d','r','a','c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
yading@11 598 { MKTAG('A','C','-','3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
yading@11 599 { MKTAG('B','S','S','D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },
yading@11 600 { MKTAG('D','T','S','1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
yading@11 601 { MKTAG('D','T','S','2'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
yading@11 602 { MKTAG('D','T','S','3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
yading@11 603 { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },
yading@11 604 { MKTAG('V','C','-','1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
yading@11 605 { 0 },
yading@11 606 };
yading@11 607
yading@11 608 /* descriptor present */
yading@11 609 static const StreamType DESC_types[] = {
yading@11 610 { 0x6a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 }, /* AC-3 descriptor */
yading@11 611 { 0x7a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC-3 descriptor */
yading@11 612 { 0x7b, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
yading@11 613 { 0x56, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_TELETEXT },
yading@11 614 { 0x59, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_SUBTITLE }, /* subtitling descriptor */
yading@11 615 { 0 },
yading@11 616 };
yading@11 617
yading@11 618 static void mpegts_find_stream_type(AVStream *st,
yading@11 619 uint32_t stream_type, const StreamType *types)
yading@11 620 {
yading@11 621 if (avcodec_is_open(st->codec)) {
yading@11 622 av_log(NULL, AV_LOG_DEBUG, "cannot set stream info, codec is open\n");
yading@11 623 return;
yading@11 624 }
yading@11 625
yading@11 626 for (; types->stream_type; types++) {
yading@11 627 if (stream_type == types->stream_type) {
yading@11 628 st->codec->codec_type = types->codec_type;
yading@11 629 st->codec->codec_id = types->codec_id;
yading@11 630 st->request_probe = 0;
yading@11 631 return;
yading@11 632 }
yading@11 633 }
yading@11 634 }
yading@11 635
yading@11 636 static int mpegts_set_stream_info(AVStream *st, PESContext *pes,
yading@11 637 uint32_t stream_type, uint32_t prog_reg_desc)
yading@11 638 {
yading@11 639 int old_codec_type= st->codec->codec_type;
yading@11 640 int old_codec_id = st->codec->codec_id;
yading@11 641
yading@11 642 if (avcodec_is_open(st->codec)) {
yading@11 643 av_log(pes->stream, AV_LOG_DEBUG, "cannot set stream info, codec is open\n");
yading@11 644 return 0;
yading@11 645 }
yading@11 646
yading@11 647 avpriv_set_pts_info(st, 33, 1, 90000);
yading@11 648 st->priv_data = pes;
yading@11 649 st->codec->codec_type = AVMEDIA_TYPE_DATA;
yading@11 650 st->codec->codec_id = AV_CODEC_ID_NONE;
yading@11 651 st->need_parsing = AVSTREAM_PARSE_FULL;
yading@11 652 pes->st = st;
yading@11 653 pes->stream_type = stream_type;
yading@11 654
yading@11 655 av_log(pes->stream, AV_LOG_DEBUG,
yading@11 656 "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
yading@11 657 st->index, pes->stream_type, pes->pid, (char*)&prog_reg_desc);
yading@11 658
yading@11 659 st->codec->codec_tag = pes->stream_type;
yading@11 660
yading@11 661 mpegts_find_stream_type(st, pes->stream_type, ISO_types);
yading@11 662 if ((prog_reg_desc == AV_RL32("HDMV") ||
yading@11 663 prog_reg_desc == AV_RL32("HDPR")) &&
yading@11 664 st->codec->codec_id == AV_CODEC_ID_NONE) {
yading@11 665 mpegts_find_stream_type(st, pes->stream_type, HDMV_types);
yading@11 666 if (pes->stream_type == 0x83) {
yading@11 667 // HDMV TrueHD streams also contain an AC3 coded version of the
yading@11 668 // audio track - add a second stream for this
yading@11 669 AVStream *sub_st;
yading@11 670 // priv_data cannot be shared between streams
yading@11 671 PESContext *sub_pes = av_malloc(sizeof(*sub_pes));
yading@11 672 if (!sub_pes)
yading@11 673 return AVERROR(ENOMEM);
yading@11 674 memcpy(sub_pes, pes, sizeof(*sub_pes));
yading@11 675
yading@11 676 sub_st = avformat_new_stream(pes->stream, NULL);
yading@11 677 if (!sub_st) {
yading@11 678 av_free(sub_pes);
yading@11 679 return AVERROR(ENOMEM);
yading@11 680 }
yading@11 681
yading@11 682 sub_st->id = pes->pid;
yading@11 683 avpriv_set_pts_info(sub_st, 33, 1, 90000);
yading@11 684 sub_st->priv_data = sub_pes;
yading@11 685 sub_st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
yading@11 686 sub_st->codec->codec_id = AV_CODEC_ID_AC3;
yading@11 687 sub_st->need_parsing = AVSTREAM_PARSE_FULL;
yading@11 688 sub_pes->sub_st = pes->sub_st = sub_st;
yading@11 689 }
yading@11 690 }
yading@11 691 if (st->codec->codec_id == AV_CODEC_ID_NONE)
yading@11 692 mpegts_find_stream_type(st, pes->stream_type, MISC_types);
yading@11 693 if (st->codec->codec_id == AV_CODEC_ID_NONE){
yading@11 694 st->codec->codec_id = old_codec_id;
yading@11 695 st->codec->codec_type= old_codec_type;
yading@11 696 }
yading@11 697
yading@11 698 return 0;
yading@11 699 }
yading@11 700
yading@11 701 static void new_pes_packet(PESContext *pes, AVPacket *pkt)
yading@11 702 {
yading@11 703 av_init_packet(pkt);
yading@11 704
yading@11 705 pkt->buf = pes->buffer;
yading@11 706 pkt->data = pes->buffer->data;
yading@11 707 pkt->size = pes->data_index;
yading@11 708
yading@11 709 if(pes->total_size != MAX_PES_PAYLOAD &&
yading@11 710 pes->pes_header_size + pes->data_index != pes->total_size + PES_START_SIZE) {
yading@11 711 av_log(pes->stream, AV_LOG_WARNING, "PES packet size mismatch\n");
yading@11 712 pes->flags |= AV_PKT_FLAG_CORRUPT;
yading@11 713 }
yading@11 714 memset(pkt->data+pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 715
yading@11 716 // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
yading@11 717 if (pes->sub_st && pes->stream_type == 0x83 && pes->extended_stream_id == 0x76)
yading@11 718 pkt->stream_index = pes->sub_st->index;
yading@11 719 else
yading@11 720 pkt->stream_index = pes->st->index;
yading@11 721 pkt->pts = pes->pts;
yading@11 722 pkt->dts = pes->dts;
yading@11 723 /* store position of first TS packet of this PES packet */
yading@11 724 pkt->pos = pes->ts_packet_pos;
yading@11 725 pkt->flags = pes->flags;
yading@11 726
yading@11 727 /* reset pts values */
yading@11 728 pes->pts = AV_NOPTS_VALUE;
yading@11 729 pes->dts = AV_NOPTS_VALUE;
yading@11 730 pes->buffer = NULL;
yading@11 731 pes->data_index = 0;
yading@11 732 pes->flags = 0;
yading@11 733 }
yading@11 734
yading@11 735 static uint64_t get_ts64(GetBitContext *gb, int bits)
yading@11 736 {
yading@11 737 if (get_bits_left(gb) < bits)
yading@11 738 return AV_NOPTS_VALUE;
yading@11 739 return get_bits64(gb, bits);
yading@11 740 }
yading@11 741
yading@11 742 static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf, int buf_size)
yading@11 743 {
yading@11 744 GetBitContext gb;
yading@11 745 int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
yading@11 746 int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
yading@11 747 int dts_flag = -1, cts_flag = -1;
yading@11 748 int64_t dts = AV_NOPTS_VALUE, cts = AV_NOPTS_VALUE;
yading@11 749
yading@11 750 init_get_bits(&gb, buf, buf_size*8);
yading@11 751
yading@11 752 if (sl->use_au_start)
yading@11 753 au_start_flag = get_bits1(&gb);
yading@11 754 if (sl->use_au_end)
yading@11 755 au_end_flag = get_bits1(&gb);
yading@11 756 if (!sl->use_au_start && !sl->use_au_end)
yading@11 757 au_start_flag = au_end_flag = 1;
yading@11 758 if (sl->ocr_len > 0)
yading@11 759 ocr_flag = get_bits1(&gb);
yading@11 760 if (sl->use_idle)
yading@11 761 idle_flag = get_bits1(&gb);
yading@11 762 if (sl->use_padding)
yading@11 763 padding_flag = get_bits1(&gb);
yading@11 764 if (padding_flag)
yading@11 765 padding_bits = get_bits(&gb, 3);
yading@11 766
yading@11 767 if (!idle_flag && (!padding_flag || padding_bits != 0)) {
yading@11 768 if (sl->packet_seq_num_len)
yading@11 769 skip_bits_long(&gb, sl->packet_seq_num_len);
yading@11 770 if (sl->degr_prior_len)
yading@11 771 if (get_bits1(&gb))
yading@11 772 skip_bits(&gb, sl->degr_prior_len);
yading@11 773 if (ocr_flag)
yading@11 774 skip_bits_long(&gb, sl->ocr_len);
yading@11 775 if (au_start_flag) {
yading@11 776 if (sl->use_rand_acc_pt)
yading@11 777 get_bits1(&gb);
yading@11 778 if (sl->au_seq_num_len > 0)
yading@11 779 skip_bits_long(&gb, sl->au_seq_num_len);
yading@11 780 if (sl->use_timestamps) {
yading@11 781 dts_flag = get_bits1(&gb);
yading@11 782 cts_flag = get_bits1(&gb);
yading@11 783 }
yading@11 784 }
yading@11 785 if (sl->inst_bitrate_len)
yading@11 786 inst_bitrate_flag = get_bits1(&gb);
yading@11 787 if (dts_flag == 1)
yading@11 788 dts = get_ts64(&gb, sl->timestamp_len);
yading@11 789 if (cts_flag == 1)
yading@11 790 cts = get_ts64(&gb, sl->timestamp_len);
yading@11 791 if (sl->au_len > 0)
yading@11 792 skip_bits_long(&gb, sl->au_len);
yading@11 793 if (inst_bitrate_flag)
yading@11 794 skip_bits_long(&gb, sl->inst_bitrate_len);
yading@11 795 }
yading@11 796
yading@11 797 if (dts != AV_NOPTS_VALUE)
yading@11 798 pes->dts = dts;
yading@11 799 if (cts != AV_NOPTS_VALUE)
yading@11 800 pes->pts = cts;
yading@11 801
yading@11 802 if (sl->timestamp_len && sl->timestamp_res)
yading@11 803 avpriv_set_pts_info(pes->st, sl->timestamp_len, 1, sl->timestamp_res);
yading@11 804
yading@11 805 return (get_bits_count(&gb) + 7) >> 3;
yading@11 806 }
yading@11 807
yading@11 808 /* return non zero if a packet could be constructed */
yading@11 809 static int mpegts_push_data(MpegTSFilter *filter,
yading@11 810 const uint8_t *buf, int buf_size, int is_start,
yading@11 811 int64_t pos)
yading@11 812 {
yading@11 813 PESContext *pes = filter->u.pes_filter.opaque;
yading@11 814 MpegTSContext *ts = pes->ts;
yading@11 815 const uint8_t *p;
yading@11 816 int len, code;
yading@11 817
yading@11 818 if(!ts->pkt)
yading@11 819 return 0;
yading@11 820
yading@11 821 if (is_start) {
yading@11 822 if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
yading@11 823 new_pes_packet(pes, ts->pkt);
yading@11 824 ts->stop_parse = 1;
yading@11 825 }
yading@11 826 pes->state = MPEGTS_HEADER;
yading@11 827 pes->data_index = 0;
yading@11 828 pes->ts_packet_pos = pos;
yading@11 829 }
yading@11 830 p = buf;
yading@11 831 while (buf_size > 0) {
yading@11 832 switch(pes->state) {
yading@11 833 case MPEGTS_HEADER:
yading@11 834 len = PES_START_SIZE - pes->data_index;
yading@11 835 if (len > buf_size)
yading@11 836 len = buf_size;
yading@11 837 memcpy(pes->header + pes->data_index, p, len);
yading@11 838 pes->data_index += len;
yading@11 839 p += len;
yading@11 840 buf_size -= len;
yading@11 841 if (pes->data_index == PES_START_SIZE) {
yading@11 842 /* we got all the PES or section header. We can now
yading@11 843 decide */
yading@11 844 if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
yading@11 845 pes->header[2] == 0x01) {
yading@11 846 /* it must be an mpeg2 PES stream */
yading@11 847 code = pes->header[3] | 0x100;
yading@11 848 av_dlog(pes->stream, "pid=%x pes_code=%#x\n", pes->pid, code);
yading@11 849
yading@11 850 if ((pes->st && pes->st->discard == AVDISCARD_ALL &&
yading@11 851 (!pes->sub_st || pes->sub_st->discard == AVDISCARD_ALL)) ||
yading@11 852 code == 0x1be) /* padding_stream */
yading@11 853 goto skip;
yading@11 854
yading@11 855 /* stream not present in PMT */
yading@11 856 if (!pes->st) {
yading@11 857 pes->st = avformat_new_stream(ts->stream, NULL);
yading@11 858 if (!pes->st)
yading@11 859 return AVERROR(ENOMEM);
yading@11 860 pes->st->id = pes->pid;
yading@11 861 mpegts_set_stream_info(pes->st, pes, 0, 0);
yading@11 862 }
yading@11 863
yading@11 864 pes->total_size = AV_RB16(pes->header + 4);
yading@11 865 /* NOTE: a zero total size means the PES size is
yading@11 866 unbounded */
yading@11 867 if (!pes->total_size)
yading@11 868 pes->total_size = MAX_PES_PAYLOAD;
yading@11 869
yading@11 870 /* allocate pes buffer */
yading@11 871 pes->buffer = av_buffer_alloc(pes->total_size +
yading@11 872 FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 873 if (!pes->buffer)
yading@11 874 return AVERROR(ENOMEM);
yading@11 875
yading@11 876 if (code != 0x1bc && code != 0x1bf && /* program_stream_map, private_stream_2 */
yading@11 877 code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */
yading@11 878 code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */
yading@11 879 code != 0x1f8) { /* ITU-T Rec. H.222.1 type E stream */
yading@11 880 pes->state = MPEGTS_PESHEADER;
yading@11 881 if (pes->st->codec->codec_id == AV_CODEC_ID_NONE && !pes->st->request_probe) {
yading@11 882 av_dlog(pes->stream, "pid=%x stream_type=%x probing\n",
yading@11 883 pes->pid, pes->stream_type);
yading@11 884 pes->st->request_probe= 1;
yading@11 885 }
yading@11 886 } else {
yading@11 887 pes->state = MPEGTS_PAYLOAD;
yading@11 888 pes->data_index = 0;
yading@11 889 }
yading@11 890 } else {
yading@11 891 /* otherwise, it should be a table */
yading@11 892 /* skip packet */
yading@11 893 skip:
yading@11 894 pes->state = MPEGTS_SKIP;
yading@11 895 continue;
yading@11 896 }
yading@11 897 }
yading@11 898 break;
yading@11 899 /**********************************************/
yading@11 900 /* PES packing parsing */
yading@11 901 case MPEGTS_PESHEADER:
yading@11 902 len = PES_HEADER_SIZE - pes->data_index;
yading@11 903 if (len < 0)
yading@11 904 return -1;
yading@11 905 if (len > buf_size)
yading@11 906 len = buf_size;
yading@11 907 memcpy(pes->header + pes->data_index, p, len);
yading@11 908 pes->data_index += len;
yading@11 909 p += len;
yading@11 910 buf_size -= len;
yading@11 911 if (pes->data_index == PES_HEADER_SIZE) {
yading@11 912 pes->pes_header_size = pes->header[8] + 9;
yading@11 913 pes->state = MPEGTS_PESHEADER_FILL;
yading@11 914 }
yading@11 915 break;
yading@11 916 case MPEGTS_PESHEADER_FILL:
yading@11 917 len = pes->pes_header_size - pes->data_index;
yading@11 918 if (len < 0)
yading@11 919 return -1;
yading@11 920 if (len > buf_size)
yading@11 921 len = buf_size;
yading@11 922 memcpy(pes->header + pes->data_index, p, len);
yading@11 923 pes->data_index += len;
yading@11 924 p += len;
yading@11 925 buf_size -= len;
yading@11 926 if (pes->data_index == pes->pes_header_size) {
yading@11 927 const uint8_t *r;
yading@11 928 unsigned int flags, pes_ext, skip;
yading@11 929
yading@11 930 flags = pes->header[7];
yading@11 931 r = pes->header + 9;
yading@11 932 pes->pts = AV_NOPTS_VALUE;
yading@11 933 pes->dts = AV_NOPTS_VALUE;
yading@11 934 if ((flags & 0xc0) == 0x80) {
yading@11 935 pes->dts = pes->pts = ff_parse_pes_pts(r);
yading@11 936 r += 5;
yading@11 937 } else if ((flags & 0xc0) == 0xc0) {
yading@11 938 pes->pts = ff_parse_pes_pts(r);
yading@11 939 r += 5;
yading@11 940 pes->dts = ff_parse_pes_pts(r);
yading@11 941 r += 5;
yading@11 942 }
yading@11 943 pes->extended_stream_id = -1;
yading@11 944 if (flags & 0x01) { /* PES extension */
yading@11 945 pes_ext = *r++;
yading@11 946 /* Skip PES private data, program packet sequence counter and P-STD buffer */
yading@11 947 skip = (pes_ext >> 4) & 0xb;
yading@11 948 skip += skip & 0x9;
yading@11 949 r += skip;
yading@11 950 if ((pes_ext & 0x41) == 0x01 &&
yading@11 951 (r + 2) <= (pes->header + pes->pes_header_size)) {
yading@11 952 /* PES extension 2 */
yading@11 953 if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
yading@11 954 pes->extended_stream_id = r[1];
yading@11 955 }
yading@11 956 }
yading@11 957
yading@11 958 /* we got the full header. We parse it and get the payload */
yading@11 959 pes->state = MPEGTS_PAYLOAD;
yading@11 960 pes->data_index = 0;
yading@11 961 if (pes->stream_type == 0x12 && buf_size > 0) {
yading@11 962 int sl_header_bytes = read_sl_header(pes, &pes->sl, p, buf_size);
yading@11 963 pes->pes_header_size += sl_header_bytes;
yading@11 964 p += sl_header_bytes;
yading@11 965 buf_size -= sl_header_bytes;
yading@11 966 }
yading@11 967 }
yading@11 968 break;
yading@11 969 case MPEGTS_PAYLOAD:
yading@11 970 if (buf_size > 0 && pes->buffer) {
yading@11 971 if (pes->data_index > 0 && pes->data_index+buf_size > pes->total_size) {
yading@11 972 new_pes_packet(pes, ts->pkt);
yading@11 973 pes->total_size = MAX_PES_PAYLOAD;
yading@11 974 pes->buffer = av_buffer_alloc(pes->total_size + FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 975 if (!pes->buffer)
yading@11 976 return AVERROR(ENOMEM);
yading@11 977 ts->stop_parse = 1;
yading@11 978 } else if (pes->data_index == 0 && buf_size > pes->total_size) {
yading@11 979 // pes packet size is < ts size packet and pes data is padded with 0xff
yading@11 980 // not sure if this is legal in ts but see issue #2392
yading@11 981 buf_size = pes->total_size;
yading@11 982 }
yading@11 983 memcpy(pes->buffer->data + pes->data_index, p, buf_size);
yading@11 984 pes->data_index += buf_size;
yading@11 985 }
yading@11 986 buf_size = 0;
yading@11 987 /* emit complete packets with known packet size
yading@11 988 * decreases demuxer delay for infrequent packets like subtitles from
yading@11 989 * a couple of seconds to milliseconds for properly muxed files.
yading@11 990 * total_size is the number of bytes following pes_packet_length
yading@11 991 * in the pes header, i.e. not counting the first PES_START_SIZE bytes */
yading@11 992 if (!ts->stop_parse && pes->total_size < MAX_PES_PAYLOAD &&
yading@11 993 pes->pes_header_size + pes->data_index == pes->total_size + PES_START_SIZE) {
yading@11 994 ts->stop_parse = 1;
yading@11 995 new_pes_packet(pes, ts->pkt);
yading@11 996 }
yading@11 997 break;
yading@11 998 case MPEGTS_SKIP:
yading@11 999 buf_size = 0;
yading@11 1000 break;
yading@11 1001 }
yading@11 1002 }
yading@11 1003
yading@11 1004 return 0;
yading@11 1005 }
yading@11 1006
yading@11 1007 static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
yading@11 1008 {
yading@11 1009 MpegTSFilter *tss;
yading@11 1010 PESContext *pes;
yading@11 1011
yading@11 1012 /* if no pid found, then add a pid context */
yading@11 1013 pes = av_mallocz(sizeof(PESContext));
yading@11 1014 if (!pes)
yading@11 1015 return 0;
yading@11 1016 pes->ts = ts;
yading@11 1017 pes->stream = ts->stream;
yading@11 1018 pes->pid = pid;
yading@11 1019 pes->pcr_pid = pcr_pid;
yading@11 1020 pes->state = MPEGTS_SKIP;
yading@11 1021 pes->pts = AV_NOPTS_VALUE;
yading@11 1022 pes->dts = AV_NOPTS_VALUE;
yading@11 1023 tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
yading@11 1024 if (!tss) {
yading@11 1025 av_free(pes);
yading@11 1026 return 0;
yading@11 1027 }
yading@11 1028 return pes;
yading@11 1029 }
yading@11 1030
yading@11 1031 #define MAX_LEVEL 4
yading@11 1032 typedef struct {
yading@11 1033 AVFormatContext *s;
yading@11 1034 AVIOContext pb;
yading@11 1035 Mp4Descr *descr;
yading@11 1036 Mp4Descr *active_descr;
yading@11 1037 int descr_count;
yading@11 1038 int max_descr_count;
yading@11 1039 int level;
yading@11 1040 } MP4DescrParseContext;
yading@11 1041
yading@11 1042 static int init_MP4DescrParseContext(
yading@11 1043 MP4DescrParseContext *d, AVFormatContext *s, const uint8_t *buf,
yading@11 1044 unsigned size, Mp4Descr *descr, int max_descr_count)
yading@11 1045 {
yading@11 1046 int ret;
yading@11 1047 if (size > (1<<30))
yading@11 1048 return AVERROR_INVALIDDATA;
yading@11 1049
yading@11 1050 if ((ret = ffio_init_context(&d->pb, (unsigned char*)buf, size, 0,
yading@11 1051 NULL, NULL, NULL, NULL)) < 0)
yading@11 1052 return ret;
yading@11 1053
yading@11 1054 d->s = s;
yading@11 1055 d->level = 0;
yading@11 1056 d->descr_count = 0;
yading@11 1057 d->descr = descr;
yading@11 1058 d->active_descr = NULL;
yading@11 1059 d->max_descr_count = max_descr_count;
yading@11 1060
yading@11 1061 return 0;
yading@11 1062 }
yading@11 1063
yading@11 1064 static void update_offsets(AVIOContext *pb, int64_t *off, int *len) {
yading@11 1065 int64_t new_off = avio_tell(pb);
yading@11 1066 (*len) -= new_off - *off;
yading@11 1067 *off = new_off;
yading@11 1068 }
yading@11 1069
yading@11 1070 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
yading@11 1071 int target_tag);
yading@11 1072
yading@11 1073 static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
yading@11 1074 {
yading@11 1075 while (len > 0) {
yading@11 1076 if (parse_mp4_descr(d, off, len, 0) < 0)
yading@11 1077 return -1;
yading@11 1078 update_offsets(&d->pb, &off, &len);
yading@11 1079 }
yading@11 1080 return 0;
yading@11 1081 }
yading@11 1082
yading@11 1083 static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
yading@11 1084 {
yading@11 1085 avio_rb16(&d->pb); // ID
yading@11 1086 avio_r8(&d->pb);
yading@11 1087 avio_r8(&d->pb);
yading@11 1088 avio_r8(&d->pb);
yading@11 1089 avio_r8(&d->pb);
yading@11 1090 avio_r8(&d->pb);
yading@11 1091 update_offsets(&d->pb, &off, &len);
yading@11 1092 return parse_mp4_descr_arr(d, off, len);
yading@11 1093 }
yading@11 1094
yading@11 1095 static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
yading@11 1096 {
yading@11 1097 int id_flags;
yading@11 1098 if (len < 2)
yading@11 1099 return 0;
yading@11 1100 id_flags = avio_rb16(&d->pb);
yading@11 1101 if (!(id_flags & 0x0020)) { //URL_Flag
yading@11 1102 update_offsets(&d->pb, &off, &len);
yading@11 1103 return parse_mp4_descr_arr(d, off, len); //ES_Descriptor[]
yading@11 1104 } else {
yading@11 1105 return 0;
yading@11 1106 }
yading@11 1107 }
yading@11 1108
yading@11 1109 static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
yading@11 1110 {
yading@11 1111 int es_id = 0;
yading@11 1112 if (d->descr_count >= d->max_descr_count)
yading@11 1113 return -1;
yading@11 1114 ff_mp4_parse_es_descr(&d->pb, &es_id);
yading@11 1115 d->active_descr = d->descr + (d->descr_count++);
yading@11 1116
yading@11 1117 d->active_descr->es_id = es_id;
yading@11 1118 update_offsets(&d->pb, &off, &len);
yading@11 1119 parse_mp4_descr(d, off, len, MP4DecConfigDescrTag);
yading@11 1120 update_offsets(&d->pb, &off, &len);
yading@11 1121 if (len > 0)
yading@11 1122 parse_mp4_descr(d, off, len, MP4SLDescrTag);
yading@11 1123 d->active_descr = NULL;
yading@11 1124 return 0;
yading@11 1125 }
yading@11 1126
yading@11 1127 static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
yading@11 1128 {
yading@11 1129 Mp4Descr *descr = d->active_descr;
yading@11 1130 if (!descr)
yading@11 1131 return -1;
yading@11 1132 d->active_descr->dec_config_descr = av_malloc(len);
yading@11 1133 if (!descr->dec_config_descr)
yading@11 1134 return AVERROR(ENOMEM);
yading@11 1135 descr->dec_config_descr_len = len;
yading@11 1136 avio_read(&d->pb, descr->dec_config_descr, len);
yading@11 1137 return 0;
yading@11 1138 }
yading@11 1139
yading@11 1140 static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
yading@11 1141 {
yading@11 1142 Mp4Descr *descr = d->active_descr;
yading@11 1143 int predefined;
yading@11 1144 if (!descr)
yading@11 1145 return -1;
yading@11 1146
yading@11 1147 predefined = avio_r8(&d->pb);
yading@11 1148 if (!predefined) {
yading@11 1149 int lengths;
yading@11 1150 int flags = avio_r8(&d->pb);
yading@11 1151 descr->sl.use_au_start = !!(flags & 0x80);
yading@11 1152 descr->sl.use_au_end = !!(flags & 0x40);
yading@11 1153 descr->sl.use_rand_acc_pt = !!(flags & 0x20);
yading@11 1154 descr->sl.use_padding = !!(flags & 0x08);
yading@11 1155 descr->sl.use_timestamps = !!(flags & 0x04);
yading@11 1156 descr->sl.use_idle = !!(flags & 0x02);
yading@11 1157 descr->sl.timestamp_res = avio_rb32(&d->pb);
yading@11 1158 avio_rb32(&d->pb);
yading@11 1159 descr->sl.timestamp_len = avio_r8(&d->pb);
yading@11 1160 descr->sl.ocr_len = avio_r8(&d->pb);
yading@11 1161 descr->sl.au_len = avio_r8(&d->pb);
yading@11 1162 descr->sl.inst_bitrate_len = avio_r8(&d->pb);
yading@11 1163 lengths = avio_rb16(&d->pb);
yading@11 1164 descr->sl.degr_prior_len = lengths >> 12;
yading@11 1165 descr->sl.au_seq_num_len = (lengths >> 7) & 0x1f;
yading@11 1166 descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
yading@11 1167 } else {
yading@11 1168 avpriv_report_missing_feature(d->s, "Predefined SLConfigDescriptor");
yading@11 1169 }
yading@11 1170 return 0;
yading@11 1171 }
yading@11 1172
yading@11 1173 static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
yading@11 1174 int target_tag) {
yading@11 1175 int tag;
yading@11 1176 int len1 = ff_mp4_read_descr(d->s, &d->pb, &tag);
yading@11 1177 update_offsets(&d->pb, &off, &len);
yading@11 1178 if (len < 0 || len1 > len || len1 <= 0) {
yading@11 1179 av_log(d->s, AV_LOG_ERROR, "Tag %x length violation new length %d bytes remaining %d\n", tag, len1, len);
yading@11 1180 return -1;
yading@11 1181 }
yading@11 1182
yading@11 1183 if (d->level++ >= MAX_LEVEL) {
yading@11 1184 av_log(d->s, AV_LOG_ERROR, "Maximum MP4 descriptor level exceeded\n");
yading@11 1185 goto done;
yading@11 1186 }
yading@11 1187
yading@11 1188 if (target_tag && tag != target_tag) {
yading@11 1189 av_log(d->s, AV_LOG_ERROR, "Found tag %x expected %x\n", tag, target_tag);
yading@11 1190 goto done;
yading@11 1191 }
yading@11 1192
yading@11 1193 switch (tag) {
yading@11 1194 case MP4IODescrTag:
yading@11 1195 parse_MP4IODescrTag(d, off, len1);
yading@11 1196 break;
yading@11 1197 case MP4ODescrTag:
yading@11 1198 parse_MP4ODescrTag(d, off, len1);
yading@11 1199 break;
yading@11 1200 case MP4ESDescrTag:
yading@11 1201 parse_MP4ESDescrTag(d, off, len1);
yading@11 1202 break;
yading@11 1203 case MP4DecConfigDescrTag:
yading@11 1204 parse_MP4DecConfigDescrTag(d, off, len1);
yading@11 1205 break;
yading@11 1206 case MP4SLDescrTag:
yading@11 1207 parse_MP4SLDescrTag(d, off, len1);
yading@11 1208 break;
yading@11 1209 }
yading@11 1210
yading@11 1211 done:
yading@11 1212 d->level--;
yading@11 1213 avio_seek(&d->pb, off + len1, SEEK_SET);
yading@11 1214 return 0;
yading@11 1215 }
yading@11 1216
yading@11 1217 static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
yading@11 1218 Mp4Descr *descr, int *descr_count, int max_descr_count)
yading@11 1219 {
yading@11 1220 MP4DescrParseContext d;
yading@11 1221 if (init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count) < 0)
yading@11 1222 return -1;
yading@11 1223
yading@11 1224 parse_mp4_descr(&d, avio_tell(&d.pb), size, MP4IODescrTag);
yading@11 1225
yading@11 1226 *descr_count = d.descr_count;
yading@11 1227 return 0;
yading@11 1228 }
yading@11 1229
yading@11 1230 static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size,
yading@11 1231 Mp4Descr *descr, int *descr_count, int max_descr_count)
yading@11 1232 {
yading@11 1233 MP4DescrParseContext d;
yading@11 1234 if (init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count) < 0)
yading@11 1235 return -1;
yading@11 1236
yading@11 1237 parse_mp4_descr_arr(&d, avio_tell(&d.pb), size);
yading@11 1238
yading@11 1239 *descr_count = d.descr_count;
yading@11 1240 return 0;
yading@11 1241 }
yading@11 1242
yading@11 1243 static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
yading@11 1244 {
yading@11 1245 MpegTSContext *ts = filter->u.section_filter.opaque;
yading@11 1246 SectionHeader h;
yading@11 1247 const uint8_t *p, *p_end;
yading@11 1248 AVIOContext pb;
yading@11 1249 Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = {{ 0 }};
yading@11 1250 int mp4_descr_count = 0;
yading@11 1251 int i, pid;
yading@11 1252 AVFormatContext *s = ts->stream;
yading@11 1253
yading@11 1254 p_end = section + section_len - 4;
yading@11 1255 p = section;
yading@11 1256 if (parse_section_header(&h, &p, p_end) < 0)
yading@11 1257 return;
yading@11 1258 if (h.tid != M4OD_TID)
yading@11 1259 return;
yading@11 1260
yading@11 1261 mp4_read_od(s, p, (unsigned)(p_end - p), mp4_descr, &mp4_descr_count, MAX_MP4_DESCR_COUNT);
yading@11 1262
yading@11 1263 for (pid = 0; pid < NB_PID_MAX; pid++) {
yading@11 1264 if (!ts->pids[pid])
yading@11 1265 continue;
yading@11 1266 for (i = 0; i < mp4_descr_count; i++) {
yading@11 1267 PESContext *pes;
yading@11 1268 AVStream *st;
yading@11 1269 if (ts->pids[pid]->es_id != mp4_descr[i].es_id)
yading@11 1270 continue;
yading@11 1271 if (!(ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES)) {
yading@11 1272 av_log(s, AV_LOG_ERROR, "pid %x is not PES\n", pid);
yading@11 1273 continue;
yading@11 1274 }
yading@11 1275 pes = ts->pids[pid]->u.pes_filter.opaque;
yading@11 1276 st = pes->st;
yading@11 1277 if (!st) {
yading@11 1278 continue;
yading@11 1279 }
yading@11 1280
yading@11 1281 pes->sl = mp4_descr[i].sl;
yading@11 1282
yading@11 1283 ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
yading@11 1284 mp4_descr[i].dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
yading@11 1285 ff_mp4_read_dec_config_descr(s, st, &pb);
yading@11 1286 if (st->codec->codec_id == AV_CODEC_ID_AAC &&
yading@11 1287 st->codec->extradata_size > 0)
yading@11 1288 st->need_parsing = 0;
yading@11 1289 if (st->codec->codec_id == AV_CODEC_ID_H264 &&
yading@11 1290 st->codec->extradata_size > 0)
yading@11 1291 st->need_parsing = 0;
yading@11 1292
yading@11 1293 if (st->codec->codec_id <= AV_CODEC_ID_NONE) {
yading@11 1294 } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_AUDIO) {
yading@11 1295 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
yading@11 1296 } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_SUBTITLE) {
yading@11 1297 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
yading@11 1298 } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_UNKNOWN) {
yading@11 1299 st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
yading@11 1300 }
yading@11 1301 }
yading@11 1302 }
yading@11 1303 for (i = 0; i < mp4_descr_count; i++)
yading@11 1304 av_free(mp4_descr[i].dec_config_descr);
yading@11 1305 }
yading@11 1306
yading@11 1307 int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type,
yading@11 1308 const uint8_t **pp, const uint8_t *desc_list_end,
yading@11 1309 Mp4Descr *mp4_descr, int mp4_descr_count, int pid,
yading@11 1310 MpegTSContext *ts)
yading@11 1311 {
yading@11 1312 const uint8_t *desc_end;
yading@11 1313 int desc_len, desc_tag, desc_es_id;
yading@11 1314 char language[252];
yading@11 1315 int i;
yading@11 1316
yading@11 1317 desc_tag = get8(pp, desc_list_end);
yading@11 1318 if (desc_tag < 0)
yading@11 1319 return -1;
yading@11 1320 desc_len = get8(pp, desc_list_end);
yading@11 1321 if (desc_len < 0)
yading@11 1322 return -1;
yading@11 1323 desc_end = *pp + desc_len;
yading@11 1324 if (desc_end > desc_list_end)
yading@11 1325 return -1;
yading@11 1326
yading@11 1327 av_dlog(fc, "tag: 0x%02x len=%d\n", desc_tag, desc_len);
yading@11 1328
yading@11 1329 if (st->codec->codec_id == AV_CODEC_ID_NONE &&
yading@11 1330 stream_type == STREAM_TYPE_PRIVATE_DATA)
yading@11 1331 mpegts_find_stream_type(st, desc_tag, DESC_types);
yading@11 1332
yading@11 1333 switch(desc_tag) {
yading@11 1334 case 0x1E: /* SL descriptor */
yading@11 1335 desc_es_id = get16(pp, desc_end);
yading@11 1336 if (ts && ts->pids[pid])
yading@11 1337 ts->pids[pid]->es_id = desc_es_id;
yading@11 1338 for (i = 0; i < mp4_descr_count; i++)
yading@11 1339 if (mp4_descr[i].dec_config_descr_len &&
yading@11 1340 mp4_descr[i].es_id == desc_es_id) {
yading@11 1341 AVIOContext pb;
yading@11 1342 ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
yading@11 1343 mp4_descr[i].dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
yading@11 1344 ff_mp4_read_dec_config_descr(fc, st, &pb);
yading@11 1345 if (st->codec->codec_id == AV_CODEC_ID_AAC &&
yading@11 1346 st->codec->extradata_size > 0)
yading@11 1347 st->need_parsing = 0;
yading@11 1348 if (st->codec->codec_id == AV_CODEC_ID_MPEG4SYSTEMS)
yading@11 1349 mpegts_open_section_filter(ts, pid, m4sl_cb, ts, 1);
yading@11 1350 }
yading@11 1351 break;
yading@11 1352 case 0x1F: /* FMC descriptor */
yading@11 1353 get16(pp, desc_end);
yading@11 1354 if (mp4_descr_count > 0 && (st->codec->codec_id == AV_CODEC_ID_AAC_LATM || st->request_probe>0) &&
yading@11 1355 mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
yading@11 1356 AVIOContext pb;
yading@11 1357 ffio_init_context(&pb, mp4_descr->dec_config_descr,
yading@11 1358 mp4_descr->dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
yading@11 1359 ff_mp4_read_dec_config_descr(fc, st, &pb);
yading@11 1360 if (st->codec->codec_id == AV_CODEC_ID_AAC &&
yading@11 1361 st->codec->extradata_size > 0){
yading@11 1362 st->request_probe= st->need_parsing = 0;
yading@11 1363 st->codec->codec_type= AVMEDIA_TYPE_AUDIO;
yading@11 1364 }
yading@11 1365 }
yading@11 1366 break;
yading@11 1367 case 0x56: /* DVB teletext descriptor */
yading@11 1368 language[0] = get8(pp, desc_end);
yading@11 1369 language[1] = get8(pp, desc_end);
yading@11 1370 language[2] = get8(pp, desc_end);
yading@11 1371 language[3] = 0;
yading@11 1372 av_dict_set(&st->metadata, "language", language, 0);
yading@11 1373 break;
yading@11 1374 case 0x59: /* subtitling descriptor */
yading@11 1375 language[0] = get8(pp, desc_end);
yading@11 1376 language[1] = get8(pp, desc_end);
yading@11 1377 language[2] = get8(pp, desc_end);
yading@11 1378 language[3] = 0;
yading@11 1379 /* hearing impaired subtitles detection */
yading@11 1380 switch(get8(pp, desc_end)) {
yading@11 1381 case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
yading@11 1382 case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
yading@11 1383 case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
yading@11 1384 case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
yading@11 1385 case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
yading@11 1386 case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
yading@11 1387 st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED;
yading@11 1388 break;
yading@11 1389 }
yading@11 1390 if (st->codec->extradata) {
yading@11 1391 if (st->codec->extradata_size == 4 && memcmp(st->codec->extradata, *pp, 4))
yading@11 1392 avpriv_request_sample(fc, "DVB sub with multiple IDs");
yading@11 1393 } else {
yading@11 1394 st->codec->extradata = av_malloc(4 + FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 1395 if (st->codec->extradata) {
yading@11 1396 st->codec->extradata_size = 4;
yading@11 1397 memcpy(st->codec->extradata, *pp, 4);
yading@11 1398 }
yading@11 1399 }
yading@11 1400 *pp += 4;
yading@11 1401 av_dict_set(&st->metadata, "language", language, 0);
yading@11 1402 break;
yading@11 1403 case 0x0a: /* ISO 639 language descriptor */
yading@11 1404 for (i = 0; i + 4 <= desc_len; i += 4) {
yading@11 1405 language[i + 0] = get8(pp, desc_end);
yading@11 1406 language[i + 1] = get8(pp, desc_end);
yading@11 1407 language[i + 2] = get8(pp, desc_end);
yading@11 1408 language[i + 3] = ',';
yading@11 1409 switch (get8(pp, desc_end)) {
yading@11 1410 case 0x01: st->disposition |= AV_DISPOSITION_CLEAN_EFFECTS; break;
yading@11 1411 case 0x02: st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED; break;
yading@11 1412 case 0x03: st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED; break;
yading@11 1413 }
yading@11 1414 }
yading@11 1415 if (i) {
yading@11 1416 language[i - 1] = 0;
yading@11 1417 av_dict_set(&st->metadata, "language", language, 0);
yading@11 1418 }
yading@11 1419 break;
yading@11 1420 case 0x05: /* registration descriptor */
yading@11 1421 st->codec->codec_tag = bytestream_get_le32(pp);
yading@11 1422 av_dlog(fc, "reg_desc=%.4s\n", (char*)&st->codec->codec_tag);
yading@11 1423 if (st->codec->codec_id == AV_CODEC_ID_NONE)
yading@11 1424 mpegts_find_stream_type(st, st->codec->codec_tag, REGD_types);
yading@11 1425 break;
yading@11 1426 case 0x52: /* stream identifier descriptor */
yading@11 1427 st->stream_identifier = 1 + get8(pp, desc_end);
yading@11 1428 break;
yading@11 1429 default:
yading@11 1430 break;
yading@11 1431 }
yading@11 1432 *pp = desc_end;
yading@11 1433 return 0;
yading@11 1434 }
yading@11 1435
yading@11 1436 static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
yading@11 1437 {
yading@11 1438 MpegTSContext *ts = filter->u.section_filter.opaque;
yading@11 1439 SectionHeader h1, *h = &h1;
yading@11 1440 PESContext *pes;
yading@11 1441 AVStream *st;
yading@11 1442 const uint8_t *p, *p_end, *desc_list_end;
yading@11 1443 int program_info_length, pcr_pid, pid, stream_type;
yading@11 1444 int desc_list_len;
yading@11 1445 uint32_t prog_reg_desc = 0; /* registration descriptor */
yading@11 1446
yading@11 1447 Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = {{ 0 }};
yading@11 1448 int mp4_descr_count = 0;
yading@11 1449 int i;
yading@11 1450
yading@11 1451 av_dlog(ts->stream, "PMT: len %i\n", section_len);
yading@11 1452 hex_dump_debug(ts->stream, section, section_len);
yading@11 1453
yading@11 1454 p_end = section + section_len - 4;
yading@11 1455 p = section;
yading@11 1456 if (parse_section_header(h, &p, p_end) < 0)
yading@11 1457 return;
yading@11 1458
yading@11 1459 av_dlog(ts->stream, "sid=0x%x sec_num=%d/%d\n",
yading@11 1460 h->id, h->sec_num, h->last_sec_num);
yading@11 1461
yading@11 1462 if (h->tid != PMT_TID)
yading@11 1463 return;
yading@11 1464
yading@11 1465 clear_program(ts, h->id);
yading@11 1466 pcr_pid = get16(&p, p_end);
yading@11 1467 if (pcr_pid < 0)
yading@11 1468 return;
yading@11 1469 pcr_pid &= 0x1fff;
yading@11 1470 add_pid_to_pmt(ts, h->id, pcr_pid);
yading@11 1471 set_pcr_pid(ts->stream, h->id, pcr_pid);
yading@11 1472
yading@11 1473 av_dlog(ts->stream, "pcr_pid=0x%x\n", pcr_pid);
yading@11 1474
yading@11 1475 program_info_length = get16(&p, p_end);
yading@11 1476 if (program_info_length < 0)
yading@11 1477 return;
yading@11 1478 program_info_length &= 0xfff;
yading@11 1479 while(program_info_length >= 2) {
yading@11 1480 uint8_t tag, len;
yading@11 1481 tag = get8(&p, p_end);
yading@11 1482 len = get8(&p, p_end);
yading@11 1483
yading@11 1484 av_dlog(ts->stream, "program tag: 0x%02x len=%d\n", tag, len);
yading@11 1485
yading@11 1486 if(len > program_info_length - 2)
yading@11 1487 //something else is broken, exit the program_descriptors_loop
yading@11 1488 break;
yading@11 1489 program_info_length -= len + 2;
yading@11 1490 if (tag == 0x1d) { // IOD descriptor
yading@11 1491 get8(&p, p_end); // scope
yading@11 1492 get8(&p, p_end); // label
yading@11 1493 len -= 2;
yading@11 1494 mp4_read_iods(ts->stream, p, len, mp4_descr + mp4_descr_count,
yading@11 1495 &mp4_descr_count, MAX_MP4_DESCR_COUNT);
yading@11 1496 } else if (tag == 0x05 && len >= 4) { // registration descriptor
yading@11 1497 prog_reg_desc = bytestream_get_le32(&p);
yading@11 1498 len -= 4;
yading@11 1499 }
yading@11 1500 p += len;
yading@11 1501 }
yading@11 1502 p += program_info_length;
yading@11 1503 if (p >= p_end)
yading@11 1504 goto out;
yading@11 1505
yading@11 1506 // stop parsing after pmt, we found header
yading@11 1507 if (!ts->stream->nb_streams)
yading@11 1508 ts->stop_parse = 2;
yading@11 1509
yading@11 1510 for(;;) {
yading@11 1511 st = 0;
yading@11 1512 pes = NULL;
yading@11 1513 stream_type = get8(&p, p_end);
yading@11 1514 if (stream_type < 0)
yading@11 1515 break;
yading@11 1516 pid = get16(&p, p_end);
yading@11 1517 if (pid < 0)
yading@11 1518 break;
yading@11 1519 pid &= 0x1fff;
yading@11 1520 if (pid == ts->current_pid)
yading@11 1521 break;
yading@11 1522
yading@11 1523 /* now create stream */
yading@11 1524 if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
yading@11 1525 pes = ts->pids[pid]->u.pes_filter.opaque;
yading@11 1526 if (!pes->st) {
yading@11 1527 pes->st = avformat_new_stream(pes->stream, NULL);
yading@11 1528 if (!pes->st)
yading@11 1529 goto out;
yading@11 1530 pes->st->id = pes->pid;
yading@11 1531 }
yading@11 1532 st = pes->st;
yading@11 1533 } else if (stream_type != 0x13) {
yading@11 1534 if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably
yading@11 1535 pes = add_pes_stream(ts, pid, pcr_pid);
yading@11 1536 if (pes) {
yading@11 1537 st = avformat_new_stream(pes->stream, NULL);
yading@11 1538 if (!st)
yading@11 1539 goto out;
yading@11 1540 st->id = pes->pid;
yading@11 1541 }
yading@11 1542 } else {
yading@11 1543 int idx = ff_find_stream_index(ts->stream, pid);
yading@11 1544 if (idx >= 0) {
yading@11 1545 st = ts->stream->streams[idx];
yading@11 1546 } else {
yading@11 1547 st = avformat_new_stream(ts->stream, NULL);
yading@11 1548 if (!st)
yading@11 1549 goto out;
yading@11 1550 st->id = pid;
yading@11 1551 st->codec->codec_type = AVMEDIA_TYPE_DATA;
yading@11 1552 }
yading@11 1553 }
yading@11 1554
yading@11 1555 if (!st)
yading@11 1556 goto out;
yading@11 1557
yading@11 1558 if (pes && !pes->stream_type)
yading@11 1559 mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
yading@11 1560
yading@11 1561 add_pid_to_pmt(ts, h->id, pid);
yading@11 1562
yading@11 1563 ff_program_add_stream_index(ts->stream, h->id, st->index);
yading@11 1564
yading@11 1565 desc_list_len = get16(&p, p_end);
yading@11 1566 if (desc_list_len < 0)
yading@11 1567 break;
yading@11 1568 desc_list_len &= 0xfff;
yading@11 1569 desc_list_end = p + desc_list_len;
yading@11 1570 if (desc_list_end > p_end)
yading@11 1571 break;
yading@11 1572 for(;;) {
yading@11 1573 if (ff_parse_mpeg2_descriptor(ts->stream, st, stream_type, &p, desc_list_end,
yading@11 1574 mp4_descr, mp4_descr_count, pid, ts) < 0)
yading@11 1575 break;
yading@11 1576
yading@11 1577 if (pes && prog_reg_desc == AV_RL32("HDMV") && stream_type == 0x83 && pes->sub_st) {
yading@11 1578 ff_program_add_stream_index(ts->stream, h->id, pes->sub_st->index);
yading@11 1579 pes->sub_st->codec->codec_tag = st->codec->codec_tag;
yading@11 1580 }
yading@11 1581 }
yading@11 1582 p = desc_list_end;
yading@11 1583 }
yading@11 1584
yading@11 1585 out:
yading@11 1586 for (i = 0; i < mp4_descr_count; i++)
yading@11 1587 av_free(mp4_descr[i].dec_config_descr);
yading@11 1588 }
yading@11 1589
yading@11 1590 static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
yading@11 1591 {
yading@11 1592 MpegTSContext *ts = filter->u.section_filter.opaque;
yading@11 1593 SectionHeader h1, *h = &h1;
yading@11 1594 const uint8_t *p, *p_end;
yading@11 1595 int sid, pmt_pid;
yading@11 1596 AVProgram *program;
yading@11 1597
yading@11 1598 av_dlog(ts->stream, "PAT:\n");
yading@11 1599 hex_dump_debug(ts->stream, section, section_len);
yading@11 1600
yading@11 1601 p_end = section + section_len - 4;
yading@11 1602 p = section;
yading@11 1603 if (parse_section_header(h, &p, p_end) < 0)
yading@11 1604 return;
yading@11 1605 if (h->tid != PAT_TID)
yading@11 1606 return;
yading@11 1607
yading@11 1608 ts->stream->ts_id = h->id;
yading@11 1609
yading@11 1610 clear_programs(ts);
yading@11 1611 for(;;) {
yading@11 1612 sid = get16(&p, p_end);
yading@11 1613 if (sid < 0)
yading@11 1614 break;
yading@11 1615 pmt_pid = get16(&p, p_end);
yading@11 1616 if (pmt_pid < 0)
yading@11 1617 break;
yading@11 1618 pmt_pid &= 0x1fff;
yading@11 1619
yading@11 1620 if (pmt_pid == ts->current_pid)
yading@11 1621 break;
yading@11 1622
yading@11 1623 av_dlog(ts->stream, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
yading@11 1624
yading@11 1625 if (sid == 0x0000) {
yading@11 1626 /* NIT info */
yading@11 1627 } else {
yading@11 1628 program = av_new_program(ts->stream, sid);
yading@11 1629 program->program_num = sid;
yading@11 1630 program->pmt_pid = pmt_pid;
yading@11 1631 if (ts->pids[pmt_pid])
yading@11 1632 mpegts_close_filter(ts, ts->pids[pmt_pid]);
yading@11 1633 mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
yading@11 1634 add_pat_entry(ts, sid);
yading@11 1635 add_pid_to_pmt(ts, sid, 0); //add pat pid to program
yading@11 1636 add_pid_to_pmt(ts, sid, pmt_pid);
yading@11 1637 }
yading@11 1638 }
yading@11 1639
yading@11 1640 if (sid < 0) {
yading@11 1641 int i,j;
yading@11 1642 for (j=0; j<ts->stream->nb_programs; j++) {
yading@11 1643 for (i=0; i<ts->nb_prg; i++)
yading@11 1644 if (ts->prg[i].id == ts->stream->programs[j]->id)
yading@11 1645 break;
yading@11 1646 if (i==ts->nb_prg)
yading@11 1647 clear_avprogram(ts, ts->stream->programs[j]->id);
yading@11 1648 }
yading@11 1649 }
yading@11 1650 }
yading@11 1651
yading@11 1652 static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
yading@11 1653 {
yading@11 1654 MpegTSContext *ts = filter->u.section_filter.opaque;
yading@11 1655 SectionHeader h1, *h = &h1;
yading@11 1656 const uint8_t *p, *p_end, *desc_list_end, *desc_end;
yading@11 1657 int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
yading@11 1658 char *name, *provider_name;
yading@11 1659
yading@11 1660 av_dlog(ts->stream, "SDT:\n");
yading@11 1661 hex_dump_debug(ts->stream, section, section_len);
yading@11 1662
yading@11 1663 p_end = section + section_len - 4;
yading@11 1664 p = section;
yading@11 1665 if (parse_section_header(h, &p, p_end) < 0)
yading@11 1666 return;
yading@11 1667 if (h->tid != SDT_TID)
yading@11 1668 return;
yading@11 1669 onid = get16(&p, p_end);
yading@11 1670 if (onid < 0)
yading@11 1671 return;
yading@11 1672 val = get8(&p, p_end);
yading@11 1673 if (val < 0)
yading@11 1674 return;
yading@11 1675 for(;;) {
yading@11 1676 sid = get16(&p, p_end);
yading@11 1677 if (sid < 0)
yading@11 1678 break;
yading@11 1679 val = get8(&p, p_end);
yading@11 1680 if (val < 0)
yading@11 1681 break;
yading@11 1682 desc_list_len = get16(&p, p_end);
yading@11 1683 if (desc_list_len < 0)
yading@11 1684 break;
yading@11 1685 desc_list_len &= 0xfff;
yading@11 1686 desc_list_end = p + desc_list_len;
yading@11 1687 if (desc_list_end > p_end)
yading@11 1688 break;
yading@11 1689 for(;;) {
yading@11 1690 desc_tag = get8(&p, desc_list_end);
yading@11 1691 if (desc_tag < 0)
yading@11 1692 break;
yading@11 1693 desc_len = get8(&p, desc_list_end);
yading@11 1694 desc_end = p + desc_len;
yading@11 1695 if (desc_end > desc_list_end)
yading@11 1696 break;
yading@11 1697
yading@11 1698 av_dlog(ts->stream, "tag: 0x%02x len=%d\n",
yading@11 1699 desc_tag, desc_len);
yading@11 1700
yading@11 1701 switch(desc_tag) {
yading@11 1702 case 0x48:
yading@11 1703 service_type = get8(&p, p_end);
yading@11 1704 if (service_type < 0)
yading@11 1705 break;
yading@11 1706 provider_name = getstr8(&p, p_end);
yading@11 1707 if (!provider_name)
yading@11 1708 break;
yading@11 1709 name = getstr8(&p, p_end);
yading@11 1710 if (name) {
yading@11 1711 AVProgram *program = av_new_program(ts->stream, sid);
yading@11 1712 if(program) {
yading@11 1713 av_dict_set(&program->metadata, "service_name", name, 0);
yading@11 1714 av_dict_set(&program->metadata, "service_provider", provider_name, 0);
yading@11 1715 }
yading@11 1716 }
yading@11 1717 av_free(name);
yading@11 1718 av_free(provider_name);
yading@11 1719 break;
yading@11 1720 default:
yading@11 1721 break;
yading@11 1722 }
yading@11 1723 p = desc_end;
yading@11 1724 }
yading@11 1725 p = desc_list_end;
yading@11 1726 }
yading@11 1727 }
yading@11 1728
yading@11 1729 /* handle one TS packet */
yading@11 1730 static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
yading@11 1731 {
yading@11 1732 AVFormatContext *s = ts->stream;
yading@11 1733 MpegTSFilter *tss;
yading@11 1734 int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
yading@11 1735 has_adaptation, has_payload;
yading@11 1736 const uint8_t *p, *p_end;
yading@11 1737 int64_t pos;
yading@11 1738
yading@11 1739 pid = AV_RB16(packet + 1) & 0x1fff;
yading@11 1740 if(pid && discard_pid(ts, pid))
yading@11 1741 return 0;
yading@11 1742 is_start = packet[1] & 0x40;
yading@11 1743 tss = ts->pids[pid];
yading@11 1744 if (ts->auto_guess && tss == NULL && is_start) {
yading@11 1745 add_pes_stream(ts, pid, -1);
yading@11 1746 tss = ts->pids[pid];
yading@11 1747 }
yading@11 1748 if (!tss)
yading@11 1749 return 0;
yading@11 1750 ts->current_pid = pid;
yading@11 1751
yading@11 1752 afc = (packet[3] >> 4) & 3;
yading@11 1753 if (afc == 0) /* reserved value */
yading@11 1754 return 0;
yading@11 1755 has_adaptation = afc & 2;
yading@11 1756 has_payload = afc & 1;
yading@11 1757 is_discontinuity = has_adaptation
yading@11 1758 && packet[4] != 0 /* with length > 0 */
yading@11 1759 && (packet[5] & 0x80); /* and discontinuity indicated */
yading@11 1760
yading@11 1761 /* continuity check (currently not used) */
yading@11 1762 cc = (packet[3] & 0xf);
yading@11 1763 expected_cc = has_payload ? (tss->last_cc + 1) & 0x0f : tss->last_cc;
yading@11 1764 cc_ok = pid == 0x1FFF // null packet PID
yading@11 1765 || is_discontinuity
yading@11 1766 || tss->last_cc < 0
yading@11 1767 || expected_cc == cc;
yading@11 1768
yading@11 1769 tss->last_cc = cc;
yading@11 1770 if (!cc_ok) {
yading@11 1771 av_log(ts->stream, AV_LOG_DEBUG,
yading@11 1772 "Continuity check failed for pid %d expected %d got %d\n",
yading@11 1773 pid, expected_cc, cc);
yading@11 1774 if(tss->type == MPEGTS_PES) {
yading@11 1775 PESContext *pc = tss->u.pes_filter.opaque;
yading@11 1776 pc->flags |= AV_PKT_FLAG_CORRUPT;
yading@11 1777 }
yading@11 1778 }
yading@11 1779
yading@11 1780 if (!has_payload)
yading@11 1781 return 0;
yading@11 1782 p = packet + 4;
yading@11 1783 if (has_adaptation) {
yading@11 1784 /* skip adaptation field */
yading@11 1785 p += p[0] + 1;
yading@11 1786 }
yading@11 1787 /* if past the end of packet, ignore */
yading@11 1788 p_end = packet + TS_PACKET_SIZE;
yading@11 1789 if (p >= p_end)
yading@11 1790 return 0;
yading@11 1791
yading@11 1792 pos = avio_tell(ts->stream->pb);
yading@11 1793 ts->pos47= pos % ts->raw_packet_size;
yading@11 1794
yading@11 1795 if (tss->type == MPEGTS_SECTION) {
yading@11 1796 if (is_start) {
yading@11 1797 /* pointer field present */
yading@11 1798 len = *p++;
yading@11 1799 if (p + len > p_end)
yading@11 1800 return 0;
yading@11 1801 if (len && cc_ok) {
yading@11 1802 /* write remaining section bytes */
yading@11 1803 write_section_data(s, tss,
yading@11 1804 p, len, 0);
yading@11 1805 /* check whether filter has been closed */
yading@11 1806 if (!ts->pids[pid])
yading@11 1807 return 0;
yading@11 1808 }
yading@11 1809 p += len;
yading@11 1810 if (p < p_end) {
yading@11 1811 write_section_data(s, tss,
yading@11 1812 p, p_end - p, 1);
yading@11 1813 }
yading@11 1814 } else {
yading@11 1815 if (cc_ok) {
yading@11 1816 write_section_data(s, tss,
yading@11 1817 p, p_end - p, 0);
yading@11 1818 }
yading@11 1819 }
yading@11 1820 } else {
yading@11 1821 int ret;
yading@11 1822 // Note: The position here points actually behind the current packet.
yading@11 1823 if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
yading@11 1824 pos - ts->raw_packet_size)) < 0)
yading@11 1825 return ret;
yading@11 1826 }
yading@11 1827
yading@11 1828 return 0;
yading@11 1829 }
yading@11 1830
yading@11 1831 /* XXX: try to find a better synchro over several packets (use
yading@11 1832 get_packet_size() ?) */
yading@11 1833 static int mpegts_resync(AVFormatContext *s)
yading@11 1834 {
yading@11 1835 AVIOContext *pb = s->pb;
yading@11 1836 int c, i;
yading@11 1837
yading@11 1838 for(i = 0;i < MAX_RESYNC_SIZE; i++) {
yading@11 1839 c = avio_r8(pb);
yading@11 1840 if (url_feof(pb))
yading@11 1841 return -1;
yading@11 1842 if (c == 0x47) {
yading@11 1843 avio_seek(pb, -1, SEEK_CUR);
yading@11 1844 return 0;
yading@11 1845 }
yading@11 1846 }
yading@11 1847 av_log(s, AV_LOG_ERROR, "max resync size reached, could not find sync byte\n");
yading@11 1848 /* no sync found */
yading@11 1849 return -1;
yading@11 1850 }
yading@11 1851
yading@11 1852 /* return -1 if error or EOF. Return 0 if OK. */
yading@11 1853 static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size)
yading@11 1854 {
yading@11 1855 AVIOContext *pb = s->pb;
yading@11 1856 int skip, len;
yading@11 1857
yading@11 1858 for(;;) {
yading@11 1859 len = avio_read(pb, buf, TS_PACKET_SIZE);
yading@11 1860 if (len != TS_PACKET_SIZE)
yading@11 1861 return len < 0 ? len : AVERROR_EOF;
yading@11 1862 /* check packet sync byte */
yading@11 1863 if (buf[0] != 0x47) {
yading@11 1864 /* find a new packet start */
yading@11 1865 avio_seek(pb, -TS_PACKET_SIZE, SEEK_CUR);
yading@11 1866 if (mpegts_resync(s) < 0)
yading@11 1867 return AVERROR(EAGAIN);
yading@11 1868 else
yading@11 1869 continue;
yading@11 1870 } else {
yading@11 1871 skip = raw_packet_size - TS_PACKET_SIZE;
yading@11 1872 if (skip > 0)
yading@11 1873 avio_skip(pb, skip);
yading@11 1874 break;
yading@11 1875 }
yading@11 1876 }
yading@11 1877 return 0;
yading@11 1878 }
yading@11 1879
yading@11 1880 static int handle_packets(MpegTSContext *ts, int nb_packets)
yading@11 1881 {
yading@11 1882 AVFormatContext *s = ts->stream;
yading@11 1883 uint8_t packet[TS_PACKET_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
yading@11 1884 int packet_num, ret = 0;
yading@11 1885
yading@11 1886 if (avio_tell(s->pb) != ts->last_pos) {
yading@11 1887 int i;
yading@11 1888 av_dlog(ts->stream, "Skipping after seek\n");
yading@11 1889 /* seek detected, flush pes buffer */
yading@11 1890 for (i = 0; i < NB_PID_MAX; i++) {
yading@11 1891 if (ts->pids[i]) {
yading@11 1892 if (ts->pids[i]->type == MPEGTS_PES) {
yading@11 1893 PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
yading@11 1894 av_buffer_unref(&pes->buffer);
yading@11 1895 pes->data_index = 0;
yading@11 1896 pes->state = MPEGTS_SKIP; /* skip until pes header */
yading@11 1897 }
yading@11 1898 ts->pids[i]->last_cc = -1;
yading@11 1899 }
yading@11 1900 }
yading@11 1901 }
yading@11 1902
yading@11 1903 ts->stop_parse = 0;
yading@11 1904 packet_num = 0;
yading@11 1905 memset(packet + TS_PACKET_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 1906 for(;;) {
yading@11 1907 packet_num++;
yading@11 1908 if (nb_packets != 0 && packet_num >= nb_packets ||
yading@11 1909 ts->stop_parse > 1) {
yading@11 1910 ret = AVERROR(EAGAIN);
yading@11 1911 break;
yading@11 1912 }
yading@11 1913 if (ts->stop_parse > 0)
yading@11 1914 break;
yading@11 1915
yading@11 1916 ret = read_packet(s, packet, ts->raw_packet_size);
yading@11 1917 if (ret != 0)
yading@11 1918 break;
yading@11 1919 ret = handle_packet(ts, packet);
yading@11 1920 if (ret != 0)
yading@11 1921 break;
yading@11 1922 }
yading@11 1923 ts->last_pos = avio_tell(s->pb);
yading@11 1924 return ret;
yading@11 1925 }
yading@11 1926
yading@11 1927 static int mpegts_probe(AVProbeData *p)
yading@11 1928 {
yading@11 1929 const int size= p->buf_size;
yading@11 1930 int maxscore=0;
yading@11 1931 int sumscore=0;
yading@11 1932 int i;
yading@11 1933 int check_count= size / TS_FEC_PACKET_SIZE;
yading@11 1934 #define CHECK_COUNT 10
yading@11 1935 #define CHECK_BLOCK 100
yading@11 1936
yading@11 1937 if (check_count < CHECK_COUNT)
yading@11 1938 return -1;
yading@11 1939
yading@11 1940 for (i=0; i<check_count; i+=CHECK_BLOCK){
yading@11 1941 int left = FFMIN(check_count - i, CHECK_BLOCK);
yading@11 1942 int score = analyze(p->buf + TS_PACKET_SIZE *i, TS_PACKET_SIZE *left, TS_PACKET_SIZE , NULL);
yading@11 1943 int dvhs_score= analyze(p->buf + TS_DVHS_PACKET_SIZE*i, TS_DVHS_PACKET_SIZE*left, TS_DVHS_PACKET_SIZE, NULL);
yading@11 1944 int fec_score = analyze(p->buf + TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , NULL);
yading@11 1945 score = FFMAX3(score, dvhs_score, fec_score);
yading@11 1946 sumscore += score;
yading@11 1947 maxscore = FFMAX(maxscore, score);
yading@11 1948 }
yading@11 1949
yading@11 1950 sumscore = sumscore*CHECK_COUNT/check_count;
yading@11 1951 maxscore = maxscore*CHECK_COUNT/CHECK_BLOCK;
yading@11 1952
yading@11 1953 av_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
yading@11 1954
yading@11 1955 if (sumscore > 6) return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
yading@11 1956 else if (maxscore > 6) return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
yading@11 1957 else return -1;
yading@11 1958 }
yading@11 1959
yading@11 1960 /* return the 90kHz PCR and the extension for the 27MHz PCR. return
yading@11 1961 (-1) if not available */
yading@11 1962 static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
yading@11 1963 const uint8_t *packet)
yading@11 1964 {
yading@11 1965 int afc, len, flags;
yading@11 1966 const uint8_t *p;
yading@11 1967 unsigned int v;
yading@11 1968
yading@11 1969 afc = (packet[3] >> 4) & 3;
yading@11 1970 if (afc <= 1)
yading@11 1971 return -1;
yading@11 1972 p = packet + 4;
yading@11 1973 len = p[0];
yading@11 1974 p++;
yading@11 1975 if (len == 0)
yading@11 1976 return -1;
yading@11 1977 flags = *p++;
yading@11 1978 len--;
yading@11 1979 if (!(flags & 0x10))
yading@11 1980 return -1;
yading@11 1981 if (len < 6)
yading@11 1982 return -1;
yading@11 1983 v = AV_RB32(p);
yading@11 1984 *ppcr_high = ((int64_t)v << 1) | (p[4] >> 7);
yading@11 1985 *ppcr_low = ((p[4] & 1) << 8) | p[5];
yading@11 1986 return 0;
yading@11 1987 }
yading@11 1988
yading@11 1989 static int mpegts_read_header(AVFormatContext *s)
yading@11 1990 {
yading@11 1991 MpegTSContext *ts = s->priv_data;
yading@11 1992 AVIOContext *pb = s->pb;
yading@11 1993 uint8_t buf[8*1024]={0};
yading@11 1994 int len;
yading@11 1995 int64_t pos;
yading@11 1996
yading@11 1997 /* read the first 8192 bytes to get packet size */
yading@11 1998 pos = avio_tell(pb);
yading@11 1999 len = avio_read(pb, buf, sizeof(buf));
yading@11 2000 ts->raw_packet_size = get_packet_size(buf, len);
yading@11 2001 if (ts->raw_packet_size <= 0) {
yading@11 2002 av_log(s, AV_LOG_WARNING, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
yading@11 2003 ts->raw_packet_size = TS_PACKET_SIZE;
yading@11 2004 }
yading@11 2005 ts->stream = s;
yading@11 2006 ts->auto_guess = 0;
yading@11 2007
yading@11 2008 if (s->iformat == &ff_mpegts_demuxer) {
yading@11 2009 /* normal demux */
yading@11 2010
yading@11 2011 /* first do a scan to get all the services */
yading@11 2012 /* NOTE: We attempt to seek on non-seekable files as well, as the
yading@11 2013 * probe buffer usually is big enough. Only warn if the seek failed
yading@11 2014 * on files where the seek should work. */
yading@11 2015 if (avio_seek(pb, pos, SEEK_SET) < 0)
yading@11 2016 av_log(s, pb->seekable ? AV_LOG_ERROR : AV_LOG_INFO, "Unable to seek back to the start\n");
yading@11 2017
yading@11 2018 mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
yading@11 2019
yading@11 2020 mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
yading@11 2021
yading@11 2022 handle_packets(ts, s->probesize / ts->raw_packet_size);
yading@11 2023 /* if could not find service, enable auto_guess */
yading@11 2024
yading@11 2025 ts->auto_guess = 1;
yading@11 2026
yading@11 2027 av_dlog(ts->stream, "tuning done\n");
yading@11 2028
yading@11 2029 s->ctx_flags |= AVFMTCTX_NOHEADER;
yading@11 2030 } else {
yading@11 2031 AVStream *st;
yading@11 2032 int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
yading@11 2033 int64_t pcrs[2], pcr_h;
yading@11 2034 int packet_count[2];
yading@11 2035 uint8_t packet[TS_PACKET_SIZE];
yading@11 2036
yading@11 2037 /* only read packets */
yading@11 2038
yading@11 2039 st = avformat_new_stream(s, NULL);
yading@11 2040 if (!st)
yading@11 2041 goto fail;
yading@11 2042 avpriv_set_pts_info(st, 60, 1, 27000000);
yading@11 2043 st->codec->codec_type = AVMEDIA_TYPE_DATA;
yading@11 2044 st->codec->codec_id = AV_CODEC_ID_MPEG2TS;
yading@11 2045
yading@11 2046 /* we iterate until we find two PCRs to estimate the bitrate */
yading@11 2047 pcr_pid = -1;
yading@11 2048 nb_pcrs = 0;
yading@11 2049 nb_packets = 0;
yading@11 2050 for(;;) {
yading@11 2051 ret = read_packet(s, packet, ts->raw_packet_size);
yading@11 2052 if (ret < 0)
yading@11 2053 return -1;
yading@11 2054 pid = AV_RB16(packet + 1) & 0x1fff;
yading@11 2055 if ((pcr_pid == -1 || pcr_pid == pid) &&
yading@11 2056 parse_pcr(&pcr_h, &pcr_l, packet) == 0) {
yading@11 2057 pcr_pid = pid;
yading@11 2058 packet_count[nb_pcrs] = nb_packets;
yading@11 2059 pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
yading@11 2060 nb_pcrs++;
yading@11 2061 if (nb_pcrs >= 2)
yading@11 2062 break;
yading@11 2063 }
yading@11 2064 nb_packets++;
yading@11 2065 }
yading@11 2066
yading@11 2067 /* NOTE1: the bitrate is computed without the FEC */
yading@11 2068 /* NOTE2: it is only the bitrate of the start of the stream */
yading@11 2069 ts->pcr_incr = (pcrs[1] - pcrs[0]) / (packet_count[1] - packet_count[0]);
yading@11 2070 ts->cur_pcr = pcrs[0] - ts->pcr_incr * packet_count[0];
yading@11 2071 s->bit_rate = (TS_PACKET_SIZE * 8) * 27e6 / ts->pcr_incr;
yading@11 2072 st->codec->bit_rate = s->bit_rate;
yading@11 2073 st->start_time = ts->cur_pcr;
yading@11 2074 av_dlog(ts->stream, "start=%0.3f pcr=%0.3f incr=%d\n",
yading@11 2075 st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr);
yading@11 2076 }
yading@11 2077
yading@11 2078 avio_seek(pb, pos, SEEK_SET);
yading@11 2079 return 0;
yading@11 2080 fail:
yading@11 2081 return -1;
yading@11 2082 }
yading@11 2083
yading@11 2084 #define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
yading@11 2085
yading@11 2086 static int mpegts_raw_read_packet(AVFormatContext *s,
yading@11 2087 AVPacket *pkt)
yading@11 2088 {
yading@11 2089 MpegTSContext *ts = s->priv_data;
yading@11 2090 int ret, i;
yading@11 2091 int64_t pcr_h, next_pcr_h, pos;
yading@11 2092 int pcr_l, next_pcr_l;
yading@11 2093 uint8_t pcr_buf[12];
yading@11 2094
yading@11 2095 if (av_new_packet(pkt, TS_PACKET_SIZE) < 0)
yading@11 2096 return AVERROR(ENOMEM);
yading@11 2097 pkt->pos= avio_tell(s->pb);
yading@11 2098 ret = read_packet(s, pkt->data, ts->raw_packet_size);
yading@11 2099 if (ret < 0) {
yading@11 2100 av_free_packet(pkt);
yading@11 2101 return ret;
yading@11 2102 }
yading@11 2103 if (ts->mpeg2ts_compute_pcr) {
yading@11 2104 /* compute exact PCR for each packet */
yading@11 2105 if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {
yading@11 2106 /* we read the next PCR (XXX: optimize it by using a bigger buffer */
yading@11 2107 pos = avio_tell(s->pb);
yading@11 2108 for(i = 0; i < MAX_PACKET_READAHEAD; i++) {
yading@11 2109 avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
yading@11 2110 avio_read(s->pb, pcr_buf, 12);
yading@11 2111 if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
yading@11 2112 /* XXX: not precise enough */
yading@11 2113 ts->pcr_incr = ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) /
yading@11 2114 (i + 1);
yading@11 2115 break;
yading@11 2116 }
yading@11 2117 }
yading@11 2118 avio_seek(s->pb, pos, SEEK_SET);
yading@11 2119 /* no next PCR found: we use previous increment */
yading@11 2120 ts->cur_pcr = pcr_h * 300 + pcr_l;
yading@11 2121 }
yading@11 2122 pkt->pts = ts->cur_pcr;
yading@11 2123 pkt->duration = ts->pcr_incr;
yading@11 2124 ts->cur_pcr += ts->pcr_incr;
yading@11 2125 }
yading@11 2126 pkt->stream_index = 0;
yading@11 2127 return 0;
yading@11 2128 }
yading@11 2129
yading@11 2130 static int mpegts_read_packet(AVFormatContext *s,
yading@11 2131 AVPacket *pkt)
yading@11 2132 {
yading@11 2133 MpegTSContext *ts = s->priv_data;
yading@11 2134 int ret, i;
yading@11 2135
yading@11 2136 pkt->size = -1;
yading@11 2137 ts->pkt = pkt;
yading@11 2138 ret = handle_packets(ts, 0);
yading@11 2139 if (ret < 0) {
yading@11 2140 av_free_packet(ts->pkt);
yading@11 2141 /* flush pes data left */
yading@11 2142 for (i = 0; i < NB_PID_MAX; i++) {
yading@11 2143 if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
yading@11 2144 PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
yading@11 2145 if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
yading@11 2146 new_pes_packet(pes, pkt);
yading@11 2147 pes->state = MPEGTS_SKIP;
yading@11 2148 ret = 0;
yading@11 2149 break;
yading@11 2150 }
yading@11 2151 }
yading@11 2152 }
yading@11 2153 }
yading@11 2154
yading@11 2155 if (!ret && pkt->size < 0)
yading@11 2156 ret = AVERROR(EINTR);
yading@11 2157 return ret;
yading@11 2158 }
yading@11 2159
yading@11 2160 static void mpegts_free(MpegTSContext *ts)
yading@11 2161 {
yading@11 2162 int i;
yading@11 2163
yading@11 2164 clear_programs(ts);
yading@11 2165
yading@11 2166 for(i=0;i<NB_PID_MAX;i++)
yading@11 2167 if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]);
yading@11 2168 }
yading@11 2169
yading@11 2170 static int mpegts_read_close(AVFormatContext *s)
yading@11 2171 {
yading@11 2172 MpegTSContext *ts = s->priv_data;
yading@11 2173 mpegts_free(ts);
yading@11 2174 return 0;
yading@11 2175 }
yading@11 2176
yading@11 2177 static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index,
yading@11 2178 int64_t *ppos, int64_t pos_limit)
yading@11 2179 {
yading@11 2180 MpegTSContext *ts = s->priv_data;
yading@11 2181 int64_t pos, timestamp;
yading@11 2182 uint8_t buf[TS_PACKET_SIZE];
yading@11 2183 int pcr_l, pcr_pid = ((PESContext*)s->streams[stream_index]->priv_data)->pcr_pid;
yading@11 2184 pos = ((*ppos + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
yading@11 2185 while(pos < pos_limit) {
yading@11 2186 if (avio_seek(s->pb, pos, SEEK_SET) < 0)
yading@11 2187 return AV_NOPTS_VALUE;
yading@11 2188 if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
yading@11 2189 return AV_NOPTS_VALUE;
yading@11 2190 if (buf[0] != 0x47) {
yading@11 2191 if (mpegts_resync(s) < 0)
yading@11 2192 return AV_NOPTS_VALUE;
yading@11 2193 pos = avio_tell(s->pb);
yading@11 2194 continue;
yading@11 2195 }
yading@11 2196 if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
yading@11 2197 parse_pcr(&timestamp, &pcr_l, buf) == 0) {
yading@11 2198 *ppos = pos;
yading@11 2199 return timestamp;
yading@11 2200 }
yading@11 2201 pos += ts->raw_packet_size;
yading@11 2202 }
yading@11 2203
yading@11 2204 return AV_NOPTS_VALUE;
yading@11 2205 }
yading@11 2206
yading@11 2207 static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
yading@11 2208 int64_t *ppos, int64_t pos_limit)
yading@11 2209 {
yading@11 2210 MpegTSContext *ts = s->priv_data;
yading@11 2211 int64_t pos;
yading@11 2212 pos = ((*ppos + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
yading@11 2213 ff_read_frame_flush(s);
yading@11 2214 if (avio_seek(s->pb, pos, SEEK_SET) < 0)
yading@11 2215 return AV_NOPTS_VALUE;
yading@11 2216 while(pos < pos_limit) {
yading@11 2217 int ret;
yading@11 2218 AVPacket pkt;
yading@11 2219 av_init_packet(&pkt);
yading@11 2220 ret= av_read_frame(s, &pkt);
yading@11 2221 if(ret < 0)
yading@11 2222 return AV_NOPTS_VALUE;
yading@11 2223 av_free_packet(&pkt);
yading@11 2224 if(pkt.dts != AV_NOPTS_VALUE && pkt.pos >= 0){
yading@11 2225 ff_reduce_index(s, pkt.stream_index);
yading@11 2226 av_add_index_entry(s->streams[pkt.stream_index], pkt.pos, pkt.dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
yading@11 2227 if(pkt.stream_index == stream_index){
yading@11 2228 *ppos= pkt.pos;
yading@11 2229 return pkt.dts;
yading@11 2230 }
yading@11 2231 }
yading@11 2232 pos = pkt.pos;
yading@11 2233 }
yading@11 2234
yading@11 2235 return AV_NOPTS_VALUE;
yading@11 2236 }
yading@11 2237
yading@11 2238 /**************************************************************/
yading@11 2239 /* parsing functions - called from other demuxers such as RTP */
yading@11 2240
yading@11 2241 MpegTSContext *ff_mpegts_parse_open(AVFormatContext *s)
yading@11 2242 {
yading@11 2243 MpegTSContext *ts;
yading@11 2244
yading@11 2245 ts = av_mallocz(sizeof(MpegTSContext));
yading@11 2246 if (!ts)
yading@11 2247 return NULL;
yading@11 2248 /* no stream case, currently used by RTP */
yading@11 2249 ts->raw_packet_size = TS_PACKET_SIZE;
yading@11 2250 ts->stream = s;
yading@11 2251 ts->auto_guess = 1;
yading@11 2252 mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
yading@11 2253 mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
yading@11 2254
yading@11 2255 return ts;
yading@11 2256 }
yading@11 2257
yading@11 2258 /* return the consumed length if a packet was output, or -1 if no
yading@11 2259 packet is output */
yading@11 2260 int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
yading@11 2261 const uint8_t *buf, int len)
yading@11 2262 {
yading@11 2263 int len1;
yading@11 2264
yading@11 2265 len1 = len;
yading@11 2266 ts->pkt = pkt;
yading@11 2267 for(;;) {
yading@11 2268 ts->stop_parse = 0;
yading@11 2269 if (len < TS_PACKET_SIZE)
yading@11 2270 return -1;
yading@11 2271 if (buf[0] != 0x47) {
yading@11 2272 buf++;
yading@11 2273 len--;
yading@11 2274 } else {
yading@11 2275 handle_packet(ts, buf);
yading@11 2276 buf += TS_PACKET_SIZE;
yading@11 2277 len -= TS_PACKET_SIZE;
yading@11 2278 if (ts->stop_parse == 1)
yading@11 2279 break;
yading@11 2280 }
yading@11 2281 }
yading@11 2282 return len1 - len;
yading@11 2283 }
yading@11 2284
yading@11 2285 void ff_mpegts_parse_close(MpegTSContext *ts)
yading@11 2286 {
yading@11 2287 mpegts_free(ts);
yading@11 2288 av_free(ts);
yading@11 2289 }
yading@11 2290
yading@11 2291 AVInputFormat ff_mpegts_demuxer = {
yading@11 2292 .name = "mpegts",
yading@11 2293 .long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
yading@11 2294 .priv_data_size = sizeof(MpegTSContext),
yading@11 2295 .read_probe = mpegts_probe,
yading@11 2296 .read_header = mpegts_read_header,
yading@11 2297 .read_packet = mpegts_read_packet,
yading@11 2298 .read_close = mpegts_read_close,
yading@11 2299 .read_timestamp = mpegts_get_dts,
yading@11 2300 .flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
yading@11 2301 };
yading@11 2302
yading@11 2303 AVInputFormat ff_mpegtsraw_demuxer = {
yading@11 2304 .name = "mpegtsraw",
yading@11 2305 .long_name = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
yading@11 2306 .priv_data_size = sizeof(MpegTSContext),
yading@11 2307 .read_header = mpegts_read_header,
yading@11 2308 .read_packet = mpegts_raw_read_packet,
yading@11 2309 .read_close = mpegts_read_close,
yading@11 2310 .read_timestamp = mpegts_get_dts,
yading@11 2311 .flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
yading@11 2312 .priv_class = &mpegtsraw_class,
yading@11 2313 };