annotate ffmpeg/libavformat/mpeg.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 * MPEG1/2 demuxer
yading@11 3 * Copyright (c) 2000, 2001, 2002 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 "avformat.h"
yading@11 23 #include "internal.h"
yading@11 24 #include "mpeg.h"
yading@11 25
yading@11 26 #if CONFIG_VOBSUB_DEMUXER
yading@11 27 # include "subtitles.h"
yading@11 28 # include "libavutil/bprint.h"
yading@11 29 #endif
yading@11 30
yading@11 31 #undef NDEBUG
yading@11 32 #include <assert.h>
yading@11 33 #include "libavutil/avassert.h"
yading@11 34
yading@11 35 /*********************************************/
yading@11 36 /* demux code */
yading@11 37
yading@11 38 #define MAX_SYNC_SIZE 100000
yading@11 39
yading@11 40 static int check_pes(const uint8_t *p, const uint8_t *end){
yading@11 41 int pes1;
yading@11 42 int pes2= (p[3] & 0xC0) == 0x80
yading@11 43 && (p[4] & 0xC0) != 0x40
yading@11 44 &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0));
yading@11 45
yading@11 46 for(p+=3; p<end && *p == 0xFF; p++);
yading@11 47 if((*p&0xC0) == 0x40) p+=2;
yading@11 48 if((*p&0xF0) == 0x20){
yading@11 49 pes1= p[0]&p[2]&p[4]&1;
yading@11 50 }else if((*p&0xF0) == 0x30){
yading@11 51 pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1;
yading@11 52 }else
yading@11 53 pes1 = *p == 0x0F;
yading@11 54
yading@11 55 return pes1||pes2;
yading@11 56 }
yading@11 57
yading@11 58 static int check_pack_header(const uint8_t *buf) {
yading@11 59 return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
yading@11 60 }
yading@11 61
yading@11 62 static int mpegps_probe(AVProbeData *p)
yading@11 63 {
yading@11 64 uint32_t code= -1;
yading@11 65 int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0;
yading@11 66 int i;
yading@11 67 int score=0;
yading@11 68
yading@11 69 for(i=0; i<p->buf_size; i++){
yading@11 70 code = (code<<8) + p->buf[i];
yading@11 71 if ((code & 0xffffff00) == 0x100) {
yading@11 72 int len= p->buf[i+1] << 8 | p->buf[i+2];
yading@11 73 int pes= check_pes(p->buf+i, p->buf+p->buf_size);
yading@11 74 int pack = check_pack_header(p->buf+i);
yading@11 75
yading@11 76 if(code == SYSTEM_HEADER_START_CODE) sys++;
yading@11 77 else if(code == PACK_START_CODE && pack) pspack++;
yading@11 78 else if((code & 0xf0) == VIDEO_ID && pes) vid++;
yading@11 79 // skip pes payload to avoid start code emulation for private
yading@11 80 // and audio streams
yading@11 81 else if((code & 0xe0) == AUDIO_ID && pes) {audio++; i+=len;}
yading@11 82 else if(code == PRIVATE_STREAM_1 && pes) {priv1++; i+=len;}
yading@11 83 else if(code == 0x1fd && pes) vid++; //VC1
yading@11 84
yading@11 85 else if((code & 0xf0) == VIDEO_ID && !pes) invalid++;
yading@11 86 else if((code & 0xe0) == AUDIO_ID && !pes) invalid++;
yading@11 87 else if(code == PRIVATE_STREAM_1 && !pes) invalid++;
yading@11 88 }
yading@11 89 }
yading@11 90
yading@11 91 if(vid+audio > invalid+1) /* invalid VDR files nd short PES streams */
yading@11 92 score= AVPROBE_SCORE_MAX/4;
yading@11 93
yading@11 94 if(sys>invalid && sys*9 <= pspack*10)
yading@11 95 return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
yading@11 96 if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
yading@11 97 return pspack > 2 ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
yading@11 98 if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048 && vid + audio > invalid) /* PES stream */
yading@11 99 return (audio > 12 || vid > 3 + 2*invalid) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4;
yading@11 100
yading@11 101 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
yading@11 102 //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
yading@11 103 //Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618
yading@11 104 return score;
yading@11 105 }
yading@11 106
yading@11 107
yading@11 108 typedef struct MpegDemuxContext {
yading@11 109 int32_t header_state;
yading@11 110 unsigned char psm_es_type[256];
yading@11 111 int sofdec;
yading@11 112 int dvd;
yading@11 113 int imkh_cctv;
yading@11 114 #if CONFIG_VOBSUB_DEMUXER
yading@11 115 AVFormatContext *sub_ctx;
yading@11 116 FFDemuxSubtitlesQueue q;
yading@11 117 #endif
yading@11 118 } MpegDemuxContext;
yading@11 119
yading@11 120 static int mpegps_read_header(AVFormatContext *s)
yading@11 121 {
yading@11 122 MpegDemuxContext *m = s->priv_data;
yading@11 123 char buffer[7];
yading@11 124 int64_t last_pos = avio_tell(s->pb);
yading@11 125
yading@11 126 m->header_state = 0xff;
yading@11 127 s->ctx_flags |= AVFMTCTX_NOHEADER;
yading@11 128
yading@11 129 avio_get_str(s->pb, 6, buffer, sizeof(buffer));
yading@11 130 if (!memcmp("IMKH", buffer, 4)) {
yading@11 131 m->imkh_cctv = 1;
yading@11 132 } else if (!memcmp("Sofdec", buffer, 6)) {
yading@11 133 m->sofdec = 1;
yading@11 134 } else
yading@11 135 avio_seek(s->pb, last_pos, SEEK_SET);
yading@11 136
yading@11 137 /* no need to do more */
yading@11 138 return 0;
yading@11 139 }
yading@11 140
yading@11 141 static int64_t get_pts(AVIOContext *pb, int c)
yading@11 142 {
yading@11 143 uint8_t buf[5];
yading@11 144
yading@11 145 buf[0] = c<0 ? avio_r8(pb) : c;
yading@11 146 avio_read(pb, buf+1, 4);
yading@11 147
yading@11 148 return ff_parse_pes_pts(buf);
yading@11 149 }
yading@11 150
yading@11 151 static int find_next_start_code(AVIOContext *pb, int *size_ptr,
yading@11 152 int32_t *header_state)
yading@11 153 {
yading@11 154 unsigned int state, v;
yading@11 155 int val, n;
yading@11 156
yading@11 157 state = *header_state;
yading@11 158 n = *size_ptr;
yading@11 159 while (n > 0) {
yading@11 160 if (url_feof(pb))
yading@11 161 break;
yading@11 162 v = avio_r8(pb);
yading@11 163 n--;
yading@11 164 if (state == 0x000001) {
yading@11 165 state = ((state << 8) | v) & 0xffffff;
yading@11 166 val = state;
yading@11 167 goto found;
yading@11 168 }
yading@11 169 state = ((state << 8) | v) & 0xffffff;
yading@11 170 }
yading@11 171 val = -1;
yading@11 172 found:
yading@11 173 *header_state = state;
yading@11 174 *size_ptr = n;
yading@11 175 return val;
yading@11 176 }
yading@11 177
yading@11 178 /**
yading@11 179 * Extract stream types from a program stream map
yading@11 180 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
yading@11 181 *
yading@11 182 * @return number of bytes occupied by PSM in the bitstream
yading@11 183 */
yading@11 184 static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
yading@11 185 {
yading@11 186 int psm_length, ps_info_length, es_map_length;
yading@11 187
yading@11 188 psm_length = avio_rb16(pb);
yading@11 189 avio_r8(pb);
yading@11 190 avio_r8(pb);
yading@11 191 ps_info_length = avio_rb16(pb);
yading@11 192
yading@11 193 /* skip program_stream_info */
yading@11 194 avio_skip(pb, ps_info_length);
yading@11 195 es_map_length = avio_rb16(pb);
yading@11 196
yading@11 197 /* at least one es available? */
yading@11 198 while (es_map_length >= 4){
yading@11 199 unsigned char type = avio_r8(pb);
yading@11 200 unsigned char es_id = avio_r8(pb);
yading@11 201 uint16_t es_info_length = avio_rb16(pb);
yading@11 202 /* remember mapping from stream id to stream type */
yading@11 203 m->psm_es_type[es_id] = type;
yading@11 204 /* skip program_stream_info */
yading@11 205 avio_skip(pb, es_info_length);
yading@11 206 es_map_length -= 4 + es_info_length;
yading@11 207 }
yading@11 208 avio_rb32(pb); /* crc32 */
yading@11 209 return 2 + psm_length;
yading@11 210 }
yading@11 211
yading@11 212 /* read the next PES header. Return its position in ppos
yading@11 213 (if not NULL), and its start code, pts and dts.
yading@11 214 */
yading@11 215 static int mpegps_read_pes_header(AVFormatContext *s,
yading@11 216 int64_t *ppos, int *pstart_code,
yading@11 217 int64_t *ppts, int64_t *pdts)
yading@11 218 {
yading@11 219 MpegDemuxContext *m = s->priv_data;
yading@11 220 int len, size, startcode, c, flags, header_len;
yading@11 221 int pes_ext, ext2_len, id_ext, skip;
yading@11 222 int64_t pts, dts;
yading@11 223 int64_t last_sync= avio_tell(s->pb);
yading@11 224
yading@11 225 error_redo:
yading@11 226 avio_seek(s->pb, last_sync, SEEK_SET);
yading@11 227 redo:
yading@11 228 /* next start code (should be immediately after) */
yading@11 229 m->header_state = 0xff;
yading@11 230 size = MAX_SYNC_SIZE;
yading@11 231 startcode = find_next_start_code(s->pb, &size, &m->header_state);
yading@11 232 last_sync = avio_tell(s->pb);
yading@11 233 if (startcode < 0){
yading@11 234 if(url_feof(s->pb))
yading@11 235 return AVERROR_EOF;
yading@11 236 //FIXME we should remember header_state
yading@11 237 return AVERROR(EAGAIN);
yading@11 238 }
yading@11 239
yading@11 240 if (startcode == PACK_START_CODE)
yading@11 241 goto redo;
yading@11 242 if (startcode == SYSTEM_HEADER_START_CODE)
yading@11 243 goto redo;
yading@11 244 if (startcode == PADDING_STREAM) {
yading@11 245 avio_skip(s->pb, avio_rb16(s->pb));
yading@11 246 goto redo;
yading@11 247 }
yading@11 248 if (startcode == PRIVATE_STREAM_2) {
yading@11 249 if (!m->sofdec) {
yading@11 250 /* Need to detect whether this from a DVD or a 'Sofdec' stream */
yading@11 251 int len = avio_rb16(s->pb);
yading@11 252 int bytesread = 0;
yading@11 253 uint8_t *ps2buf = av_malloc(len);
yading@11 254
yading@11 255 if (ps2buf) {
yading@11 256 bytesread = avio_read(s->pb, ps2buf, len);
yading@11 257
yading@11 258 if (bytesread != len) {
yading@11 259 avio_skip(s->pb, len - bytesread);
yading@11 260 } else {
yading@11 261 uint8_t *p = 0;
yading@11 262 if (len >= 6)
yading@11 263 p = memchr(ps2buf, 'S', len - 5);
yading@11 264
yading@11 265 if (p)
yading@11 266 m->sofdec = !memcmp(p+1, "ofdec", 5);
yading@11 267
yading@11 268 m->sofdec -= !m->sofdec;
yading@11 269
yading@11 270 if (m->sofdec < 0) {
yading@11 271 if (len == 980 && ps2buf[0] == 0) {
yading@11 272 /* PCI structure? */
yading@11 273 uint32_t startpts = AV_RB32(ps2buf + 0x0d);
yading@11 274 uint32_t endpts = AV_RB32(ps2buf + 0x11);
yading@11 275 uint8_t hours = ((ps2buf[0x19] >> 4) * 10) + (ps2buf[0x19] & 0x0f);
yading@11 276 uint8_t mins = ((ps2buf[0x1a] >> 4) * 10) + (ps2buf[0x1a] & 0x0f);
yading@11 277 uint8_t secs = ((ps2buf[0x1b] >> 4) * 10) + (ps2buf[0x1b] & 0x0f);
yading@11 278
yading@11 279 m->dvd = (hours <= 23 &&
yading@11 280 mins <= 59 &&
yading@11 281 secs <= 59 &&
yading@11 282 (ps2buf[0x19] & 0x0f) < 10 &&
yading@11 283 (ps2buf[0x1a] & 0x0f) < 10 &&
yading@11 284 (ps2buf[0x1b] & 0x0f) < 10 &&
yading@11 285 endpts >= startpts);
yading@11 286 } else if (len == 1018 && ps2buf[0] == 1) {
yading@11 287 /* DSI structure? */
yading@11 288 uint8_t hours = ((ps2buf[0x1d] >> 4) * 10) + (ps2buf[0x1d] & 0x0f);
yading@11 289 uint8_t mins = ((ps2buf[0x1e] >> 4) * 10) + (ps2buf[0x1e] & 0x0f);
yading@11 290 uint8_t secs = ((ps2buf[0x1f] >> 4) * 10) + (ps2buf[0x1f] & 0x0f);
yading@11 291
yading@11 292 m->dvd = (hours <= 23 &&
yading@11 293 mins <= 59 &&
yading@11 294 secs <= 59 &&
yading@11 295 (ps2buf[0x1d] & 0x0f) < 10 &&
yading@11 296 (ps2buf[0x1e] & 0x0f) < 10 &&
yading@11 297 (ps2buf[0x1f] & 0x0f) < 10);
yading@11 298 }
yading@11 299 }
yading@11 300 }
yading@11 301
yading@11 302 av_free(ps2buf);
yading@11 303
yading@11 304 /* If this isn't a DVD packet or no memory
yading@11 305 * could be allocated, just ignore it.
yading@11 306 * If we did, move back to the start of the
yading@11 307 * packet (plus 'length' field) */
yading@11 308 if (!m->dvd || avio_skip(s->pb, -(len + 2)) < 0) {
yading@11 309 /* Skip back failed.
yading@11 310 * This packet will be lost but that can't be helped
yading@11 311 * if we can't skip back
yading@11 312 */
yading@11 313 goto redo;
yading@11 314 }
yading@11 315 } else {
yading@11 316 /* No memory */
yading@11 317 avio_skip(s->pb, len);
yading@11 318 goto redo;
yading@11 319 }
yading@11 320 } else if (!m->dvd) {
yading@11 321 int len = avio_rb16(s->pb);
yading@11 322 avio_skip(s->pb, len);
yading@11 323 goto redo;
yading@11 324 }
yading@11 325 }
yading@11 326 if (startcode == PROGRAM_STREAM_MAP) {
yading@11 327 mpegps_psm_parse(m, s->pb);
yading@11 328 goto redo;
yading@11 329 }
yading@11 330
yading@11 331 /* find matching stream */
yading@11 332 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
yading@11 333 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
yading@11 334 (startcode == 0x1bd) ||
yading@11 335 (startcode == PRIVATE_STREAM_2) ||
yading@11 336 (startcode == 0x1fd)))
yading@11 337 goto redo;
yading@11 338 if (ppos) {
yading@11 339 *ppos = avio_tell(s->pb) - 4;
yading@11 340 }
yading@11 341 len = avio_rb16(s->pb);
yading@11 342 pts =
yading@11 343 dts = AV_NOPTS_VALUE;
yading@11 344 if (startcode != PRIVATE_STREAM_2)
yading@11 345 {
yading@11 346 /* stuffing */
yading@11 347 for(;;) {
yading@11 348 if (len < 1)
yading@11 349 goto error_redo;
yading@11 350 c = avio_r8(s->pb);
yading@11 351 len--;
yading@11 352 /* XXX: for mpeg1, should test only bit 7 */
yading@11 353 if (c != 0xff)
yading@11 354 break;
yading@11 355 }
yading@11 356 if ((c & 0xc0) == 0x40) {
yading@11 357 /* buffer scale & size */
yading@11 358 avio_r8(s->pb);
yading@11 359 c = avio_r8(s->pb);
yading@11 360 len -= 2;
yading@11 361 }
yading@11 362 if ((c & 0xe0) == 0x20) {
yading@11 363 dts = pts = get_pts(s->pb, c);
yading@11 364 len -= 4;
yading@11 365 if (c & 0x10){
yading@11 366 dts = get_pts(s->pb, -1);
yading@11 367 len -= 5;
yading@11 368 }
yading@11 369 } else if ((c & 0xc0) == 0x80) {
yading@11 370 /* mpeg 2 PES */
yading@11 371 flags = avio_r8(s->pb);
yading@11 372 header_len = avio_r8(s->pb);
yading@11 373 len -= 2;
yading@11 374 if (header_len > len)
yading@11 375 goto error_redo;
yading@11 376 len -= header_len;
yading@11 377 if (flags & 0x80) {
yading@11 378 dts = pts = get_pts(s->pb, -1);
yading@11 379 header_len -= 5;
yading@11 380 if (flags & 0x40) {
yading@11 381 dts = get_pts(s->pb, -1);
yading@11 382 header_len -= 5;
yading@11 383 }
yading@11 384 }
yading@11 385 if (flags & 0x3f && header_len == 0){
yading@11 386 flags &= 0xC0;
yading@11 387 av_log(s, AV_LOG_WARNING, "Further flags set but no bytes left\n");
yading@11 388 }
yading@11 389 if (flags & 0x01) { /* PES extension */
yading@11 390 pes_ext = avio_r8(s->pb);
yading@11 391 header_len--;
yading@11 392 /* Skip PES private data, program packet sequence counter and P-STD buffer */
yading@11 393 skip = (pes_ext >> 4) & 0xb;
yading@11 394 skip += skip & 0x9;
yading@11 395 if (pes_ext & 0x40 || skip > header_len){
yading@11 396 av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext);
yading@11 397 pes_ext=skip=0;
yading@11 398 }
yading@11 399 avio_skip(s->pb, skip);
yading@11 400 header_len -= skip;
yading@11 401
yading@11 402 if (pes_ext & 0x01) { /* PES extension 2 */
yading@11 403 ext2_len = avio_r8(s->pb);
yading@11 404 header_len--;
yading@11 405 if ((ext2_len & 0x7f) > 0) {
yading@11 406 id_ext = avio_r8(s->pb);
yading@11 407 if ((id_ext & 0x80) == 0)
yading@11 408 startcode = ((startcode & 0xff) << 8) | id_ext;
yading@11 409 header_len--;
yading@11 410 }
yading@11 411 }
yading@11 412 }
yading@11 413 if(header_len < 0)
yading@11 414 goto error_redo;
yading@11 415 avio_skip(s->pb, header_len);
yading@11 416 }
yading@11 417 else if( c!= 0xf )
yading@11 418 goto redo;
yading@11 419 }
yading@11 420
yading@11 421 if (startcode == PRIVATE_STREAM_1) {
yading@11 422 startcode = avio_r8(s->pb);
yading@11 423 len--;
yading@11 424 }
yading@11 425 if(len<0)
yading@11 426 goto error_redo;
yading@11 427 if(dts != AV_NOPTS_VALUE && ppos){
yading@11 428 int i;
yading@11 429 for(i=0; i<s->nb_streams; i++){
yading@11 430 if(startcode == s->streams[i]->id &&
yading@11 431 s->pb->seekable /* index useless on streams anyway */) {
yading@11 432 ff_reduce_index(s, i);
yading@11 433 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
yading@11 434 }
yading@11 435 }
yading@11 436 }
yading@11 437
yading@11 438 *pstart_code = startcode;
yading@11 439 *ppts = pts;
yading@11 440 *pdts = dts;
yading@11 441 return len;
yading@11 442 }
yading@11 443
yading@11 444 static int mpegps_read_packet(AVFormatContext *s,
yading@11 445 AVPacket *pkt)
yading@11 446 {
yading@11 447 MpegDemuxContext *m = s->priv_data;
yading@11 448 AVStream *st;
yading@11 449 int len, startcode, i, es_type, ret;
yading@11 450 int lpcm_header_len = -1; //Init to supress warning
yading@11 451 int request_probe= 0;
yading@11 452 enum AVCodecID codec_id = AV_CODEC_ID_NONE;
yading@11 453 enum AVMediaType type;
yading@11 454 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
yading@11 455
yading@11 456 redo:
yading@11 457 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
yading@11 458 if (len < 0)
yading@11 459 return len;
yading@11 460
yading@11 461 if (startcode >= 0x80 && startcode <= 0xcf) {
yading@11 462 if(len < 4)
yading@11 463 goto skip;
yading@11 464
yading@11 465 /* audio: skip header */
yading@11 466 avio_r8(s->pb);
yading@11 467 lpcm_header_len = avio_rb16(s->pb);
yading@11 468 len -= 3;
yading@11 469 if (startcode >= 0xb0 && startcode <= 0xbf) {
yading@11 470 /* MLP/TrueHD audio has a 4-byte header */
yading@11 471 avio_r8(s->pb);
yading@11 472 len--;
yading@11 473 }
yading@11 474 }
yading@11 475
yading@11 476 /* now find stream */
yading@11 477 for(i=0;i<s->nb_streams;i++) {
yading@11 478 st = s->streams[i];
yading@11 479 if (st->id == startcode)
yading@11 480 goto found;
yading@11 481 }
yading@11 482
yading@11 483 es_type = m->psm_es_type[startcode & 0xff];
yading@11 484 if(es_type == STREAM_TYPE_VIDEO_MPEG1){
yading@11 485 codec_id = AV_CODEC_ID_MPEG2VIDEO;
yading@11 486 type = AVMEDIA_TYPE_VIDEO;
yading@11 487 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
yading@11 488 codec_id = AV_CODEC_ID_MPEG2VIDEO;
yading@11 489 type = AVMEDIA_TYPE_VIDEO;
yading@11 490 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
yading@11 491 es_type == STREAM_TYPE_AUDIO_MPEG2){
yading@11 492 codec_id = AV_CODEC_ID_MP3;
yading@11 493 type = AVMEDIA_TYPE_AUDIO;
yading@11 494 } else if(es_type == STREAM_TYPE_AUDIO_AAC){
yading@11 495 codec_id = AV_CODEC_ID_AAC;
yading@11 496 type = AVMEDIA_TYPE_AUDIO;
yading@11 497 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
yading@11 498 codec_id = AV_CODEC_ID_MPEG4;
yading@11 499 type = AVMEDIA_TYPE_VIDEO;
yading@11 500 } else if(es_type == STREAM_TYPE_VIDEO_H264){
yading@11 501 codec_id = AV_CODEC_ID_H264;
yading@11 502 type = AVMEDIA_TYPE_VIDEO;
yading@11 503 } else if(es_type == STREAM_TYPE_AUDIO_AC3){
yading@11 504 codec_id = AV_CODEC_ID_AC3;
yading@11 505 type = AVMEDIA_TYPE_AUDIO;
yading@11 506 } else if(m->imkh_cctv && es_type == 0x91){
yading@11 507 codec_id = AV_CODEC_ID_PCM_MULAW;
yading@11 508 type = AVMEDIA_TYPE_AUDIO;
yading@11 509 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
yading@11 510 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
yading@11 511 unsigned char buf[8];
yading@11 512 avio_read(s->pb, buf, 8);
yading@11 513 avio_seek(s->pb, -8, SEEK_CUR);
yading@11 514 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
yading@11 515 codec_id = AV_CODEC_ID_CAVS;
yading@11 516 else
yading@11 517 request_probe= 1;
yading@11 518 type = AVMEDIA_TYPE_VIDEO;
yading@11 519 } else if (startcode == PRIVATE_STREAM_2) {
yading@11 520 type = AVMEDIA_TYPE_DATA;
yading@11 521 codec_id = AV_CODEC_ID_DVD_NAV;
yading@11 522 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
yading@11 523 type = AVMEDIA_TYPE_AUDIO;
yading@11 524 codec_id = m->sofdec > 0 ? AV_CODEC_ID_ADPCM_ADX : AV_CODEC_ID_MP2;
yading@11 525 } else if (startcode >= 0x80 && startcode <= 0x87) {
yading@11 526 type = AVMEDIA_TYPE_AUDIO;
yading@11 527 codec_id = AV_CODEC_ID_AC3;
yading@11 528 } else if ( ( startcode >= 0x88 && startcode <= 0x8f)
yading@11 529 ||( startcode >= 0x98 && startcode <= 0x9f)) {
yading@11 530 /* 0x90 - 0x97 is reserved for SDDS in DVD specs */
yading@11 531 type = AVMEDIA_TYPE_AUDIO;
yading@11 532 codec_id = AV_CODEC_ID_DTS;
yading@11 533 } else if (startcode >= 0xa0 && startcode <= 0xaf) {
yading@11 534 type = AVMEDIA_TYPE_AUDIO;
yading@11 535 if(lpcm_header_len == 6) {
yading@11 536 codec_id = AV_CODEC_ID_MLP;
yading@11 537 } else {
yading@11 538 /* 16 bit form will be handled as AV_CODEC_ID_PCM_S16BE */
yading@11 539 codec_id = AV_CODEC_ID_PCM_DVD;
yading@11 540 }
yading@11 541 } else if (startcode >= 0xb0 && startcode <= 0xbf) {
yading@11 542 type = AVMEDIA_TYPE_AUDIO;
yading@11 543 codec_id = AV_CODEC_ID_TRUEHD;
yading@11 544 } else if (startcode >= 0xc0 && startcode <= 0xcf) {
yading@11 545 /* Used for both AC-3 and E-AC-3 in EVOB files */
yading@11 546 type = AVMEDIA_TYPE_AUDIO;
yading@11 547 codec_id = AV_CODEC_ID_AC3;
yading@11 548 } else if (startcode >= 0x20 && startcode <= 0x3f) {
yading@11 549 type = AVMEDIA_TYPE_SUBTITLE;
yading@11 550 codec_id = AV_CODEC_ID_DVD_SUBTITLE;
yading@11 551 } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
yading@11 552 type = AVMEDIA_TYPE_VIDEO;
yading@11 553 codec_id = AV_CODEC_ID_VC1;
yading@11 554 } else {
yading@11 555 skip:
yading@11 556 /* skip packet */
yading@11 557 avio_skip(s->pb, len);
yading@11 558 goto redo;
yading@11 559 }
yading@11 560 /* no stream found: add a new stream */
yading@11 561 st = avformat_new_stream(s, NULL);
yading@11 562 if (!st)
yading@11 563 goto skip;
yading@11 564 st->id = startcode;
yading@11 565 st->codec->codec_type = type;
yading@11 566 st->codec->codec_id = codec_id;
yading@11 567 if (st->codec->codec_id == AV_CODEC_ID_PCM_MULAW) {
yading@11 568 st->codec->channels = 1;
yading@11 569 st->codec->channel_layout = AV_CH_LAYOUT_MONO;
yading@11 570 st->codec->sample_rate = 8000;
yading@11 571 }
yading@11 572 st->request_probe = request_probe;
yading@11 573 if (codec_id != AV_CODEC_ID_PCM_S16BE)
yading@11 574 st->need_parsing = AVSTREAM_PARSE_FULL;
yading@11 575 found:
yading@11 576 if(st->discard >= AVDISCARD_ALL)
yading@11 577 goto skip;
yading@11 578 if (startcode >= 0xa0 && startcode <= 0xaf) {
yading@11 579 if (lpcm_header_len == 6 && st->codec->codec_id == AV_CODEC_ID_MLP) {
yading@11 580 if (len < 6)
yading@11 581 goto skip;
yading@11 582 avio_skip(s->pb, 6);
yading@11 583 len -=6;
yading@11 584 } else {
yading@11 585 int b1, freq;
yading@11 586
yading@11 587 /* for LPCM, we just skip the header and consider it is raw
yading@11 588 audio data */
yading@11 589 if (len <= 3)
yading@11 590 goto skip;
yading@11 591 avio_r8(s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
yading@11 592 b1 = avio_r8(s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
yading@11 593 avio_r8(s->pb); /* dynamic range control (0x80 = off) */
yading@11 594 len -= 3;
yading@11 595 freq = (b1 >> 4) & 3;
yading@11 596 st->codec->sample_rate = lpcm_freq_tab[freq];
yading@11 597 st->codec->channels = 1 + (b1 & 7);
yading@11 598 st->codec->bits_per_coded_sample = 16 + ((b1 >> 6) & 3) * 4;
yading@11 599 st->codec->bit_rate = st->codec->channels *
yading@11 600 st->codec->sample_rate *
yading@11 601 st->codec->bits_per_coded_sample;
yading@11 602 if (st->codec->bits_per_coded_sample == 16)
yading@11 603 st->codec->codec_id = AV_CODEC_ID_PCM_S16BE;
yading@11 604 else if (st->codec->bits_per_coded_sample == 28)
yading@11 605 return AVERROR(EINVAL);
yading@11 606 }
yading@11 607 }
yading@11 608 ret = av_get_packet(s->pb, pkt, len);
yading@11 609 pkt->pts = pts;
yading@11 610 pkt->dts = dts;
yading@11 611 pkt->pos = dummy_pos;
yading@11 612 pkt->stream_index = st->index;
yading@11 613 av_dlog(s, "%d: pts=%0.3f dts=%0.3f size=%d\n",
yading@11 614 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0,
yading@11 615 pkt->size);
yading@11 616
yading@11 617 return (ret < 0) ? ret : 0;
yading@11 618 }
yading@11 619
yading@11 620 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
yading@11 621 int64_t *ppos, int64_t pos_limit)
yading@11 622 {
yading@11 623 int len, startcode;
yading@11 624 int64_t pos, pts, dts;
yading@11 625
yading@11 626 pos = *ppos;
yading@11 627 if (avio_seek(s->pb, pos, SEEK_SET) < 0)
yading@11 628 return AV_NOPTS_VALUE;
yading@11 629
yading@11 630 for(;;) {
yading@11 631 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
yading@11 632 if (len < 0) {
yading@11 633 av_dlog(s, "none (ret=%d)\n", len);
yading@11 634 return AV_NOPTS_VALUE;
yading@11 635 }
yading@11 636 if (startcode == s->streams[stream_index]->id &&
yading@11 637 dts != AV_NOPTS_VALUE) {
yading@11 638 break;
yading@11 639 }
yading@11 640 avio_skip(s->pb, len);
yading@11 641 }
yading@11 642 av_dlog(s, "pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n",
yading@11 643 pos, dts, dts / 90000.0);
yading@11 644 *ppos = pos;
yading@11 645 return dts;
yading@11 646 }
yading@11 647
yading@11 648 AVInputFormat ff_mpegps_demuxer = {
yading@11 649 .name = "mpeg",
yading@11 650 .long_name = NULL_IF_CONFIG_SMALL("MPEG-PS (MPEG-2 Program Stream)"),
yading@11 651 .priv_data_size = sizeof(MpegDemuxContext),
yading@11 652 .read_probe = mpegps_probe,
yading@11 653 .read_header = mpegps_read_header,
yading@11 654 .read_packet = mpegps_read_packet,
yading@11 655 .read_timestamp = mpegps_read_dts,
yading@11 656 .flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
yading@11 657 };
yading@11 658
yading@11 659 #if CONFIG_VOBSUB_DEMUXER
yading@11 660
yading@11 661 #define REF_STRING "# VobSub index file,"
yading@11 662
yading@11 663 static int vobsub_probe(AVProbeData *p)
yading@11 664 {
yading@11 665 if (!strncmp(p->buf, REF_STRING, sizeof(REF_STRING) - 1))
yading@11 666 return AVPROBE_SCORE_MAX;
yading@11 667 return 0;
yading@11 668 }
yading@11 669
yading@11 670 static int vobsub_read_header(AVFormatContext *s)
yading@11 671 {
yading@11 672 int i, ret = 0, header_parsed = 0, langidx = 0;
yading@11 673 MpegDemuxContext *vobsub = s->priv_data;
yading@11 674 char *sub_name = NULL;
yading@11 675 size_t fname_len;
yading@11 676 char *ext, *header_str;
yading@11 677 AVBPrint header;
yading@11 678 int64_t delay = 0;
yading@11 679 AVStream *st = NULL;
yading@11 680
yading@11 681 sub_name = av_strdup(s->filename);
yading@11 682 fname_len = strlen(sub_name);
yading@11 683 ext = sub_name - 3 + fname_len;
yading@11 684 if (fname_len < 4 || *(ext - 1) != '.') {
yading@11 685 av_log(s, AV_LOG_ERROR, "The input index filename is too short "
yading@11 686 "to guess the associated .SUB file\n");
yading@11 687 ret = AVERROR_INVALIDDATA;
yading@11 688 goto end;
yading@11 689 }
yading@11 690 memcpy(ext, !strncmp(ext, "IDX", 3) ? "SUB" : "sub", 3);
yading@11 691 av_log(s, AV_LOG_VERBOSE, "IDX/SUB: %s -> %s\n", s->filename, sub_name);
yading@11 692 ret = avformat_open_input(&vobsub->sub_ctx, sub_name, &ff_mpegps_demuxer, NULL);
yading@11 693 if (ret < 0) {
yading@11 694 av_log(s, AV_LOG_ERROR, "Unable to open %s as MPEG subtitles\n", sub_name);
yading@11 695 goto end;
yading@11 696 }
yading@11 697
yading@11 698 av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
yading@11 699 while (!url_feof(s->pb)) {
yading@11 700 char line[2048];
yading@11 701 int len = ff_get_line(s->pb, line, sizeof(line));
yading@11 702
yading@11 703 if (!len)
yading@11 704 break;
yading@11 705
yading@11 706 line[strcspn(line, "\r\n")] = 0;
yading@11 707
yading@11 708 if (!strncmp(line, "id:", 3)) {
yading@11 709 int n, stream_id = 0;
yading@11 710 char id[64] = {0};
yading@11 711
yading@11 712 n = sscanf(line, "id: %63[^,], index: %u", id, &stream_id);
yading@11 713 if (n != 2) {
yading@11 714 av_log(s, AV_LOG_WARNING, "Unable to parse index line '%s', "
yading@11 715 "assuming 'id: und, index: 0'\n", line);
yading@11 716 strcpy(id, "und");
yading@11 717 stream_id = 0;
yading@11 718 }
yading@11 719
yading@11 720 st = avformat_new_stream(s, NULL);
yading@11 721 if (!st) {
yading@11 722 ret = AVERROR(ENOMEM);
yading@11 723 goto end;
yading@11 724 }
yading@11 725 st->id = stream_id;
yading@11 726 st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
yading@11 727 st->codec->codec_id = AV_CODEC_ID_DVD_SUBTITLE;
yading@11 728 av_dict_set(&st->metadata, "language", id, 0);
yading@11 729 av_log(s, AV_LOG_DEBUG, "IDX stream[%d] id=%s\n", stream_id, id);
yading@11 730 header_parsed = 1;
yading@11 731
yading@11 732 } else if (st && !strncmp(line, "timestamp:", 10)) {
yading@11 733 AVPacket *sub;
yading@11 734 int hh, mm, ss, ms;
yading@11 735 int64_t pos, timestamp;
yading@11 736 const char *p = line + 10;
yading@11 737
yading@11 738 if (sscanf(p, "%02d:%02d:%02d:%03d, filepos: %"SCNx64,
yading@11 739 &hh, &mm, &ss, &ms, &pos) != 5) {
yading@11 740 av_log(s, AV_LOG_ERROR, "Unable to parse timestamp line '%s', "
yading@11 741 "abort parsing\n", line);
yading@11 742 break;
yading@11 743 }
yading@11 744 timestamp = (hh*3600LL + mm*60LL + ss) * 1000LL + ms + delay;
yading@11 745 timestamp = av_rescale_q(timestamp, (AVRational){1,1000}, st->time_base);
yading@11 746
yading@11 747 sub = ff_subtitles_queue_insert(&vobsub->q, "", 0, 0);
yading@11 748 if (!sub) {
yading@11 749 ret = AVERROR(ENOMEM);
yading@11 750 goto end;
yading@11 751 }
yading@11 752 sub->pos = pos;
yading@11 753 sub->pts = timestamp;
yading@11 754 sub->stream_index = s->nb_streams - 1;
yading@11 755
yading@11 756 } else if (st && !strncmp(line, "alt:", 4)) {
yading@11 757 const char *p = line + 4;
yading@11 758
yading@11 759 while (*p == ' ')
yading@11 760 p++;
yading@11 761 av_dict_set(&st->metadata, "title", p, 0);
yading@11 762 av_log(s, AV_LOG_DEBUG, "IDX stream[%d] name=%s\n", st->id, p);
yading@11 763 header_parsed = 1;
yading@11 764
yading@11 765 } else if (!strncmp(line, "delay:", 6)) {
yading@11 766 int sign = 1, hh = 0, mm = 0, ss = 0, ms = 0;
yading@11 767 const char *p = line + 6;
yading@11 768
yading@11 769 while (*p == ' ')
yading@11 770 p++;
yading@11 771 if (*p == '-' || *p == '+') {
yading@11 772 sign = *p == '-' ? -1 : 1;
yading@11 773 p++;
yading@11 774 }
yading@11 775 sscanf(p, "%d:%d:%d:%d", &hh, &mm, &ss, &ms);
yading@11 776 delay = ((hh*3600LL + mm*60LL + ss) * 1000LL + ms) * sign;
yading@11 777
yading@11 778 } else if (!strncmp(line, "langidx:", 8)) {
yading@11 779 const char *p = line + 8;
yading@11 780
yading@11 781 if (sscanf(p, "%d", &langidx) != 1)
yading@11 782 av_log(s, AV_LOG_ERROR, "Invalid langidx specified\n");
yading@11 783
yading@11 784 } else if (!header_parsed) {
yading@11 785 if (line[0] && line[0] != '#')
yading@11 786 av_bprintf(&header, "%s\n", line);
yading@11 787 }
yading@11 788 }
yading@11 789
yading@11 790 if (langidx < s->nb_streams)
yading@11 791 s->streams[langidx]->disposition |= AV_DISPOSITION_DEFAULT;
yading@11 792
yading@11 793 ff_subtitles_queue_finalize(&vobsub->q);
yading@11 794
yading@11 795 if (!av_bprint_is_complete(&header)) {
yading@11 796 av_bprint_finalize(&header, NULL);
yading@11 797 ret = AVERROR(ENOMEM);
yading@11 798 goto end;
yading@11 799 }
yading@11 800 av_bprint_finalize(&header, &header_str);
yading@11 801 for (i = 0; i < s->nb_streams; i++) {
yading@11 802 AVStream *sub_st = s->streams[i];
yading@11 803 sub_st->codec->extradata = av_strdup(header_str);
yading@11 804 sub_st->codec->extradata_size = header.len;
yading@11 805 }
yading@11 806 av_free(header_str);
yading@11 807
yading@11 808 end:
yading@11 809 av_free(sub_name);
yading@11 810 return ret;
yading@11 811 }
yading@11 812
yading@11 813 #define FAIL(r) do { ret = r; goto fail; } while (0)
yading@11 814
yading@11 815 static int vobsub_read_packet(AVFormatContext *s, AVPacket *pkt)
yading@11 816 {
yading@11 817 MpegDemuxContext *vobsub = s->priv_data;
yading@11 818 FFDemuxSubtitlesQueue *q = &vobsub->q;
yading@11 819 AVIOContext *pb = vobsub->sub_ctx->pb;
yading@11 820 int ret, psize, len16 = -1;
yading@11 821 AVPacket idx_pkt;
yading@11 822
yading@11 823 ret = ff_subtitles_queue_read_packet(q, &idx_pkt);
yading@11 824 if (ret < 0)
yading@11 825 return ret;
yading@11 826
yading@11 827 /* compute maximum packet size using the next packet position. This is
yading@11 828 * useful when the len in the header is non-sense */
yading@11 829 if (q->current_sub_idx < q->nb_subs) {
yading@11 830 psize = q->subs[q->current_sub_idx].pos - idx_pkt.pos;
yading@11 831 } else {
yading@11 832 int64_t fsize = avio_size(pb);
yading@11 833 psize = fsize < 0 ? 0xffff : fsize - idx_pkt.pos;
yading@11 834 }
yading@11 835
yading@11 836 avio_seek(pb, idx_pkt.pos, SEEK_SET);
yading@11 837
yading@11 838 av_init_packet(pkt);
yading@11 839 pkt->size = 0;
yading@11 840 pkt->data = NULL;
yading@11 841
yading@11 842 do {
yading@11 843 int n, to_read, startcode;
yading@11 844 int64_t pts, dts;
yading@11 845
yading@11 846 ret = mpegps_read_pes_header(vobsub->sub_ctx, NULL, &startcode, &pts, &dts);
yading@11 847 if (ret < 0)
yading@11 848 FAIL(ret);
yading@11 849 to_read = ret & 0xffff;
yading@11 850
yading@11 851 /* this prevents reads above the current packet */
yading@11 852 if (pkt->size + to_read > psize)
yading@11 853 break;
yading@11 854
yading@11 855 /* if the len is computed, we check for overread */
yading@11 856 if (len16 != -1 && pkt->size + to_read > len16)
yading@11 857 break;
yading@11 858
yading@11 859 /* the current chunk doesn't match the stream index (unlikely) */
yading@11 860 if ((startcode & 0x1f) != idx_pkt.stream_index)
yading@11 861 break;
yading@11 862
yading@11 863 ret = av_grow_packet(pkt, to_read);
yading@11 864 if (ret < 0)
yading@11 865 FAIL(ret);
yading@11 866
yading@11 867 n = avio_read(pb, pkt->data + (pkt->size - to_read), to_read);
yading@11 868 if (n < to_read)
yading@11 869 pkt->size -= to_read - n;
yading@11 870
yading@11 871 /* first chunk contains the total len of the packet to raise */
yading@11 872 if (len16 == -1 && n > 2)
yading@11 873 len16 = AV_RB16(pkt->data);
yading@11 874 } while (len16 != -1 && pkt->size != len16);
yading@11 875
yading@11 876 pkt->pts = pkt->dts = idx_pkt.pts;
yading@11 877 pkt->pos = idx_pkt.pos;
yading@11 878 pkt->stream_index = idx_pkt.stream_index;
yading@11 879
yading@11 880 av_free_packet(&idx_pkt);
yading@11 881 return 0;
yading@11 882
yading@11 883 fail:
yading@11 884 av_free_packet(&idx_pkt);
yading@11 885 return ret;
yading@11 886 }
yading@11 887
yading@11 888 static int vobsub_read_seek(AVFormatContext *s, int stream_index,
yading@11 889 int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
yading@11 890 {
yading@11 891 MpegDemuxContext *vobsub = s->priv_data;
yading@11 892 return ff_subtitles_queue_seek(&vobsub->q, s, stream_index,
yading@11 893 min_ts, ts, max_ts, flags);
yading@11 894 }
yading@11 895
yading@11 896 static int vobsub_read_close(AVFormatContext *s)
yading@11 897 {
yading@11 898 MpegDemuxContext *vobsub = s->priv_data;
yading@11 899 ff_subtitles_queue_clean(&vobsub->q);
yading@11 900 if (vobsub->sub_ctx)
yading@11 901 avformat_close_input(&vobsub->sub_ctx);
yading@11 902 return 0;
yading@11 903 }
yading@11 904
yading@11 905 AVInputFormat ff_vobsub_demuxer = {
yading@11 906 .name = "vobsub",
yading@11 907 .long_name = NULL_IF_CONFIG_SMALL("VobSub subtitle format"),
yading@11 908 .priv_data_size = sizeof(MpegDemuxContext),
yading@11 909 .read_probe = vobsub_probe,
yading@11 910 .read_header = vobsub_read_header,
yading@11 911 .read_packet = vobsub_read_packet,
yading@11 912 .read_seek2 = vobsub_read_seek,
yading@11 913 .read_close = vobsub_read_close,
yading@11 914 .flags = AVFMT_SHOW_IDS,
yading@11 915 .extensions = "idx",
yading@11 916 };
yading@11 917 #endif