Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(408)

Side by Side Diff: patched-ffmpeg-mt/libavformat/mpegtsenc.c

Issue 789004: ffmpeg roll of source to mar 9 version... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * MPEG2 transport stream (aka DVB) muxer 2 * MPEG2 transport stream (aka DVB) muxer
3 * Copyright (c) 2003 Fabrice Bellard 3 * Copyright (c) 2003 Fabrice Bellard
4 * 4 *
5 * This file is part of FFmpeg. 5 * This file is part of FFmpeg.
6 * 6 *
7 * FFmpeg is free software; you can redistribute it and/or 7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public 8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version. 10 * version 2.1 of the License, or (at your option) any later version.
11 * 11 *
12 * FFmpeg is distributed in the hope that it will be useful, 12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details. 15 * Lesser General Public License for more details.
16 * 16 *
17 * You should have received a copy of the GNU Lesser General Public 17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software 18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */ 20 */
21 21
22 #include "libavutil/bswap.h" 22 #include "libavutil/bswap.h"
23 #include "libavutil/crc.h" 23 #include "libavutil/crc.h"
24 #include "libavcodec/mpegvideo.h" 24 #include "libavcodec/mpegvideo.h"
25 #include "avformat.h" 25 #include "avformat.h"
26 #include "mpegts.h" 26 #include "mpegts.h"
27 #include "adts.h"
27 28
28 /* write DVB SI sections */ 29 /* write DVB SI sections */
29 30
30 /*********************************************/ 31 /*********************************************/
31 /* mpegts section writer */ 32 /* mpegts section writer */
32 33
33 typedef struct MpegTSSection { 34 typedef struct MpegTSSection {
34 int pid; 35 int pid;
35 int cc; 36 int cc;
36 void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet); 37 void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet);
(...skipping 15 matching lines...) Expand all
52 MpegTSSection sdt; /* MPEG2 sdt table context */ 53 MpegTSSection sdt; /* MPEG2 sdt table context */
53 MpegTSService **services; 54 MpegTSService **services;
54 int sdt_packet_count; 55 int sdt_packet_count;
55 int sdt_packet_period; 56 int sdt_packet_period;
56 int pat_packet_count; 57 int pat_packet_count;
57 int pat_packet_period; 58 int pat_packet_period;
58 int nb_services; 59 int nb_services;
59 int onid; 60 int onid;
60 int tsid; 61 int tsid;
61 uint64_t cur_pcr; 62 uint64_t cur_pcr;
62 int mux_rate; 63 int mux_rate; ///< set to 1 when VBR
63 } MpegTSWrite; 64 } MpegTSWrite;
64 65
65 /* NOTE: 4 bytes must be left at the end for the crc32 */ 66 /* NOTE: 4 bytes must be left at the end for the crc32 */
66 static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len) 67 static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len)
67 { 68 {
68 MpegTSWrite *ts = ((AVFormatContext*)s->opaque)->priv_data; 69 MpegTSWrite *ts = ((AVFormatContext*)s->opaque)->priv_data;
69 unsigned int crc; 70 unsigned int crc;
70 unsigned char packet[TS_PACKET_SIZE]; 71 unsigned char packet[TS_PACKET_SIZE];
71 const unsigned char *buf_ptr; 72 const unsigned char *buf_ptr;
72 unsigned char *q; 73 unsigned char *q;
73 int first, b, len1, left; 74 int first, b, len1, left;
74 75
75 crc = bswap_32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, buf, len - 4)); 76 crc = bswap_32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, buf, len - 4));
76 buf[len - 4] = (crc >> 24) & 0xff; 77 buf[len - 4] = (crc >> 24) & 0xff;
77 buf[len - 3] = (crc >> 16) & 0xff; 78 buf[len - 3] = (crc >> 16) & 0xff;
78 buf[len - 2] = (crc >> 8) & 0xff; 79 buf[len - 2] = (crc >> 8) & 0xff;
79 buf[len - 1] = (crc) & 0xff; 80 buf[len - 1] = (crc) & 0xff;
80 81
81 /* send each packet */ 82 /* send each packet */
82 buf_ptr = buf; 83 buf_ptr = buf;
83 while (len > 0) { 84 while (len > 0) {
84 first = (buf == buf_ptr); 85 first = (buf == buf_ptr);
85 q = packet; 86 q = packet;
86 *q++ = 0x47; 87 *q++ = 0x47;
87 b = (s->pid >> 8); 88 b = (s->pid >> 8);
88 if (first) 89 if (first)
89 b |= 0x40; 90 b |= 0x40;
90 *q++ = b; 91 *q++ = b;
91 *q++ = s->pid; 92 *q++ = s->pid;
93 s->cc = (s->cc + 1) & 0xf;
92 *q++ = 0x10 | s->cc; 94 *q++ = 0x10 | s->cc;
93 s->cc = (s->cc + 1) & 0xf;
94 if (first) 95 if (first)
95 *q++ = 0; /* 0 offset */ 96 *q++ = 0; /* 0 offset */
96 len1 = TS_PACKET_SIZE - (q - packet); 97 len1 = TS_PACKET_SIZE - (q - packet);
97 if (len1 > len) 98 if (len1 > len)
98 len1 = len; 99 len1 = len;
99 memcpy(q, buf_ptr, len1); 100 memcpy(q, buf_ptr, len1);
100 q += len1; 101 q += len1;
101 /* add known padding data */ 102 /* add known padding data */
102 left = TS_PACKET_SIZE - (q - packet); 103 left = TS_PACKET_SIZE - (q - packet);
103 if (left > 0) 104 if (left > 0)
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 171
171 typedef struct MpegTSWriteStream { 172 typedef struct MpegTSWriteStream {
172 struct MpegTSService *service; 173 struct MpegTSService *service;
173 int pid; /* stream associated pid */ 174 int pid; /* stream associated pid */
174 int cc; 175 int cc;
175 int payload_index; 176 int payload_index;
176 int first_pts_check; ///< first pts check needed 177 int first_pts_check; ///< first pts check needed
177 int64_t payload_pts; 178 int64_t payload_pts;
178 int64_t payload_dts; 179 int64_t payload_dts;
179 uint8_t payload[DEFAULT_PES_PAYLOAD_SIZE]; 180 uint8_t payload[DEFAULT_PES_PAYLOAD_SIZE];
181 ADTSContext *adts;
180 } MpegTSWriteStream; 182 } MpegTSWriteStream;
181 183
182 static void mpegts_write_pat(AVFormatContext *s) 184 static void mpegts_write_pat(AVFormatContext *s)
183 { 185 {
184 MpegTSWrite *ts = s->priv_data; 186 MpegTSWrite *ts = s->priv_data;
185 MpegTSService *service; 187 MpegTSService *service;
186 uint8_t data[1012], *q; 188 uint8_t data[1012], *q;
187 int i; 189 int i;
188 190
189 q = data; 191 q = data;
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 { 377 {
376 AVFormatContext *ctx = s->opaque; 378 AVFormatContext *ctx = s->opaque;
377 put_buffer(ctx->pb, packet, TS_PACKET_SIZE); 379 put_buffer(ctx->pb, packet, TS_PACKET_SIZE);
378 } 380 }
379 381
380 static int mpegts_write_header(AVFormatContext *s) 382 static int mpegts_write_header(AVFormatContext *s)
381 { 383 {
382 MpegTSWrite *ts = s->priv_data; 384 MpegTSWrite *ts = s->priv_data;
383 MpegTSWriteStream *ts_st; 385 MpegTSWriteStream *ts_st;
384 MpegTSService *service; 386 MpegTSService *service;
385 AVStream *st; 387 AVStream *st, *pcr_st = NULL;
386 AVMetadataTag *title; 388 AVMetadataTag *title;
387 int i, total_bit_rate; 389 int i;
388 const char *service_name; 390 const char *service_name;
389 uint64_t sdt_size, pat_pmt_size, pos;
390 391
391 ts->tsid = DEFAULT_TSID; 392 ts->tsid = DEFAULT_TSID;
392 ts->onid = DEFAULT_ONID; 393 ts->onid = DEFAULT_ONID;
393 /* allocate a single DVB service */ 394 /* allocate a single DVB service */
394 title = av_metadata_get(s->metadata, "title", NULL, 0); 395 title = av_metadata_get(s->metadata, "title", NULL, 0);
395 service_name = title ? title->value : DEFAULT_SERVICE_NAME; 396 service_name = title ? title->value : DEFAULT_SERVICE_NAME;
396 service = mpegts_add_service(ts, DEFAULT_SID, 397 service = mpegts_add_service(ts, DEFAULT_SID,
397 DEFAULT_PROVIDER_NAME, service_name); 398 DEFAULT_PROVIDER_NAME, service_name);
398 service->pmt.write_packet = section_write_packet; 399 service->pmt.write_packet = section_write_packet;
399 service->pmt.opaque = s; 400 service->pmt.opaque = s;
401 service->pmt.cc = 15;
400 402
401 ts->pat.pid = PAT_PID; 403 ts->pat.pid = PAT_PID;
402 ts->pat.cc = 0; 404 ts->pat.cc = 15; // Initialize at 15 so that it wraps and be equal to 0 for the first packet we write
403 ts->pat.write_packet = section_write_packet; 405 ts->pat.write_packet = section_write_packet;
404 ts->pat.opaque = s; 406 ts->pat.opaque = s;
405 407
406 ts->sdt.pid = SDT_PID; 408 ts->sdt.pid = SDT_PID;
407 ts->sdt.cc = 0; 409 ts->sdt.cc = 15;
408 ts->sdt.write_packet = section_write_packet; 410 ts->sdt.write_packet = section_write_packet;
409 ts->sdt.opaque = s; 411 ts->sdt.opaque = s;
410 412
411 /* assign pids to each stream */ 413 /* assign pids to each stream */
412 total_bit_rate = 0;
413 for(i = 0;i < s->nb_streams; i++) { 414 for(i = 0;i < s->nb_streams; i++) {
414 st = s->streams[i]; 415 st = s->streams[i];
415 ts_st = av_mallocz(sizeof(MpegTSWriteStream)); 416 ts_st = av_mallocz(sizeof(MpegTSWriteStream));
416 if (!ts_st) 417 if (!ts_st)
417 goto fail; 418 goto fail;
418 st->priv_data = ts_st; 419 st->priv_data = ts_st;
419 ts_st->service = service; 420 ts_st->service = service;
420 ts_st->pid = DEFAULT_START_PID + i; 421 ts_st->pid = DEFAULT_START_PID + i;
421 ts_st->payload_pts = AV_NOPTS_VALUE; 422 ts_st->payload_pts = AV_NOPTS_VALUE;
422 ts_st->payload_dts = AV_NOPTS_VALUE; 423 ts_st->payload_dts = AV_NOPTS_VALUE;
423 ts_st->first_pts_check = 1; 424 ts_st->first_pts_check = 1;
425 ts_st->cc = 15;
424 /* update PCR pid by using the first video stream */ 426 /* update PCR pid by using the first video stream */
425 if (st->codec->codec_type == CODEC_TYPE_VIDEO && 427 if (st->codec->codec_type == CODEC_TYPE_VIDEO &&
426 service->pcr_pid == 0x1fff) 428 service->pcr_pid == 0x1fff) {
427 service->pcr_pid = ts_st->pid; 429 service->pcr_pid = ts_st->pid;
428 if (st->codec->rc_max_rate) 430 pcr_st = st;
429 total_bit_rate += st->codec->rc_max_rate;
430 else {
431 if (!st->codec->bit_rate) {
432 av_log(s, AV_LOG_WARNING,
433 "stream %d, bit rate is not set, this will cause problems \n",
434 st->index);
435 }
436 total_bit_rate += st->codec->bit_rate;
437 } 431 }
438 /* PES header size */ 432 if (st->codec->codec_id == CODEC_ID_AAC &&
439 if (st->codec->codec_type == CODEC_TYPE_VIDEO || 433 st->codec->extradata_size > 0) {
440 st->codec->codec_type == CODEC_TYPE_SUBTITLE) { 434 ts_st->adts = av_mallocz(sizeof(*ts_st->adts));
441 /* 1 PES per frame 435 if (!ts_st->adts)
442 * 19 bytes of PES header 436 return AVERROR_NOMEM;
443 * on average a half TS-packet (184/2) of padding-overhead every PES */ 437 if (ff_adts_decode_extradata(s, ts_st->adts, st->codec->extradata,
444 total_bit_rate += (19 + 184/2)*8 / av_q2d(st->codec->time_base); 438 st->codec->extradata_size) < 0)
445 } else { 439 return -1;
446 /* 1 PES per DEFAULT_PES_PAYLOAD_SIZE bytes of audio data
447 * 14 bytes of PES header
448 * on average a half TS-packet (184/2) of padding-overhead every PES */
449 total_bit_rate += (14 + 184/2) *
450 st->codec->bit_rate / DEFAULT_PES_PAYLOAD_SIZE;
451 } 440 }
452 } 441 }
453 442
454 /* if no video stream, use the first stream as PCR */ 443 /* if no video stream, use the first stream as PCR */
455 if (service->pcr_pid == 0x1fff && s->nb_streams > 0) { 444 if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
456 ts_st = s->streams[0]->priv_data; 445 pcr_st = s->streams[0];
446 ts_st = pcr_st->priv_data;
457 service->pcr_pid = ts_st->pid; 447 service->pcr_pid = ts_st->pid;
458 } 448 }
459 449
460 ts->mux_rate = 1; // avoid div by 0 450 ts->mux_rate = s->mux_rate ? s->mux_rate : 1;
461 451
462 /* write info at the start of the file, so that it will be fast to 452 if (ts->mux_rate > 1) {
463 find them */
464 pos = url_ftell(s->pb);
465 mpegts_write_sdt(s);
466 sdt_size = url_ftell(s->pb) - pos;
467 pos = url_ftell(s->pb);
468 mpegts_write_pat(s);
469 for(i = 0; i < ts->nb_services; i++) {
470 mpegts_write_pmt(s, ts->services[i]);
471 }
472 pat_pmt_size = url_ftell(s->pb) - pos;
473
474 if (total_bit_rate <= 8 * 1024)
475 total_bit_rate = 8 * 1024;
476
477 total_bit_rate +=
478 total_bit_rate * 4 / (TS_PACKET_SIZE-4) + /* TS header size */
479 1000 * 8 * sdt_size / PAT_RETRANS_TIME + /* SDT size */
480 1000 * 8 * pat_pmt_size / SDT_RETRANS_TIME + /* PAT+PMT size */
481 1000 * 8 * 8 / PCR_RETRANS_TIME; /* PCR size */
482
483 if (s->mux_rate)
484 ts->mux_rate = s->mux_rate;
485 else
486 ts->mux_rate = total_bit_rate;
487
488 service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME) / 453 service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME) /
489 (TS_PACKET_SIZE * 8 * 1000); 454 (TS_PACKET_SIZE * 8 * 1000);
490 ts->sdt_packet_period = (ts->mux_rate * SDT_RETRANS_TIME) / 455 ts->sdt_packet_period = (ts->mux_rate * SDT_RETRANS_TIME) /
491 (TS_PACKET_SIZE * 8 * 1000); 456 (TS_PACKET_SIZE * 8 * 1000);
492 ts->pat_packet_period = (ts->mux_rate * PAT_RETRANS_TIME) / 457 ts->pat_packet_period = (ts->mux_rate * PAT_RETRANS_TIME) /
493 (TS_PACKET_SIZE * 8 * 1000); 458 (TS_PACKET_SIZE * 8 * 1000);
494 459
460 ts->cur_pcr = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
461 } else {
462 /* Arbitrary values, PAT/PMT could be written on key frames */
463 ts->sdt_packet_period = 200;
464 ts->pat_packet_period = 40;
465 if (pcr_st->codec->codec_type == CODEC_TYPE_AUDIO) {
466 if (!pcr_st->codec->frame_size) {
467 av_log(s, AV_LOG_WARNING, "frame size not set\n");
468 service->pcr_packet_period =
469 pcr_st->codec->sample_rate/(10*512);
470 } else {
471 service->pcr_packet_period =
472 pcr_st->codec->sample_rate/(10*pcr_st->codec->frame_size);
473 }
474 } else {
475 // max delta PCR 0.1s
476 service->pcr_packet_period =
477 pcr_st->codec->time_base.den/(10*pcr_st->codec->time_base.num);
478 }
479 }
480
495 // output a PCR as soon as possible 481 // output a PCR as soon as possible
496 service->pcr_packet_count = service->pcr_packet_period; 482 service->pcr_packet_count = service->pcr_packet_period;
483 ts->pat_packet_count = ts->pat_packet_period-1;
484 ts->sdt_packet_count = ts->sdt_packet_period-1;
497 485
498 av_log(s, AV_LOG_DEBUG, 486 av_log(s, AV_LOG_INFO,
499 "calculated bitrate %d bps, muxrate %d bps, " 487 "muxrate %d bps, pcr every %d pkts, "
500 "sdt every %d, pat/pmt every %d pkts\n", 488 "sdt every %d, pat/pmt every %d pkts\n",
501 total_bit_rate, ts->mux_rate, ts->sdt_packet_period, 489 ts->mux_rate, service->pcr_packet_period,
502 ts->pat_packet_period); 490 ts->sdt_packet_period, ts->pat_packet_period);
503 491
504 // adjust pcr
505 ts->cur_pcr /= ts->mux_rate;
506 492
507 put_flush_packet(s->pb); 493 put_flush_packet(s->pb);
508 494
509 return 0; 495 return 0;
510 496
511 fail: 497 fail:
512 for(i = 0;i < s->nb_streams; i++) { 498 for(i = 0;i < s->nb_streams; i++) {
513 st = s->streams[i]; 499 st = s->streams[i];
514 av_free(st->priv_data); 500 av_free(st->priv_data);
515 } 501 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 int afc_len, stuffing_len; 601 int afc_len, stuffing_len;
616 int64_t pcr = -1; /* avoid warning */ 602 int64_t pcr = -1; /* avoid warning */
617 int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE); 603 int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
618 604
619 is_start = 1; 605 is_start = 1;
620 while (payload_size > 0) { 606 while (payload_size > 0) {
621 retransmit_si_info(s); 607 retransmit_si_info(s);
622 608
623 write_pcr = 0; 609 write_pcr = 0;
624 if (ts_st->pid == ts_st->service->pcr_pid) { 610 if (ts_st->pid == ts_st->service->pcr_pid) {
625 ts_st->service->pcr_packet_count++; 611 if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on fram es
612 ts_st->service->pcr_packet_count++;
626 if (ts_st->service->pcr_packet_count >= 613 if (ts_st->service->pcr_packet_count >=
627 ts_st->service->pcr_packet_period) { 614 ts_st->service->pcr_packet_period) {
628 ts_st->service->pcr_packet_count = 0; 615 ts_st->service->pcr_packet_count = 0;
629 write_pcr = 1; 616 write_pcr = 1;
630 } 617 }
631 } 618 }
632 619
633 if (dts != AV_NOPTS_VALUE && (dts - (int64_t)ts->cur_pcr) > delay) { 620 if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
621 (dts - (int64_t)ts->cur_pcr) > delay) {
634 /* pcr insert gets priority over null packet insert */ 622 /* pcr insert gets priority over null packet insert */
635 if (write_pcr) 623 if (write_pcr)
636 mpegts_insert_pcr_only(s, st); 624 mpegts_insert_pcr_only(s, st);
637 else 625 else
638 mpegts_insert_null_packet(s); 626 mpegts_insert_null_packet(s);
639 continue; /* recalculate write_pcr and possibly retransmit si_info * / 627 continue; /* recalculate write_pcr and possibly retransmit si_info * /
640 } 628 }
641 629
642 /* prepare packet header */ 630 /* prepare packet header */
643 q = buf; 631 q = buf;
644 *q++ = 0x47; 632 *q++ = 0x47;
645 val = (ts_st->pid >> 8); 633 val = (ts_st->pid >> 8);
646 if (is_start) 634 if (is_start)
647 val |= 0x40; 635 val |= 0x40;
648 *q++ = val; 636 *q++ = val;
649 *q++ = ts_st->pid; 637 *q++ = ts_st->pid;
638 ts_st->cc = (ts_st->cc + 1) & 0xf;
650 *q++ = 0x10 | ts_st->cc | (write_pcr ? 0x20 : 0); 639 *q++ = 0x10 | ts_st->cc | (write_pcr ? 0x20 : 0);
651 ts_st->cc = (ts_st->cc + 1) & 0xf;
652 if (write_pcr) { 640 if (write_pcr) {
653 // add 11, pcr references the last byte of program clock reference b ase 641 // add 11, pcr references the last byte of program clock reference b ase
654 pcr = ts->cur_pcr + (4+7)*8*90000LL / ts->mux_rate; 642 if (ts->mux_rate > 1)
643 pcr = ts->cur_pcr + (4+7)*8*90000LL / ts->mux_rate;
644 else
645 pcr = dts - delay;
655 if (dts != AV_NOPTS_VALUE && dts < pcr) 646 if (dts != AV_NOPTS_VALUE && dts < pcr)
656 av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n"); 647 av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
657 *q++ = 7; /* AFC length */ 648 *q++ = 7; /* AFC length */
658 *q++ = 0x10; /* flags: PCR present */ 649 *q++ = 0x10; /* flags: PCR present */
659 *q++ = pcr >> 25; 650 *q++ = pcr >> 25;
660 *q++ = pcr >> 17; 651 *q++ = pcr >> 17;
661 *q++ = pcr >> 9; 652 *q++ = pcr >> 9;
662 *q++ = pcr >> 1; 653 *q++ = pcr >> 1;
663 *q++ = (pcr & 1) << 7; 654 *q++ = (pcr & 1) << 7;
664 *q++ = 0; 655 *q++ = 0;
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 put_flush_packet(s->pb); 772 put_flush_packet(s->pb);
782 } 773 }
783 774
784 static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) 775 static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
785 { 776 {
786 AVStream *st = s->streams[pkt->stream_index]; 777 AVStream *st = s->streams[pkt->stream_index];
787 int size = pkt->size; 778 int size = pkt->size;
788 uint8_t *buf= pkt->data; 779 uint8_t *buf= pkt->data;
789 uint8_t *data= NULL; 780 uint8_t *data= NULL;
790 MpegTSWriteStream *ts_st = st->priv_data; 781 MpegTSWriteStream *ts_st = st->priv_data;
791 const uint64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE); 782 const uint64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2;
792 int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE; 783 int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE;
793 784
794 if (pkt->pts != AV_NOPTS_VALUE) 785 if (pkt->pts != AV_NOPTS_VALUE)
795 pts = pkt->pts + delay; 786 pts = pkt->pts + delay;
796 if (pkt->dts != AV_NOPTS_VALUE) 787 if (pkt->dts != AV_NOPTS_VALUE)
797 dts = pkt->dts + delay; 788 dts = pkt->dts + delay;
798 789
799 if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) { 790 if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
800 av_log(s, AV_LOG_ERROR, "first pts value must set\n"); 791 av_log(s, AV_LOG_ERROR, "first pts value must set\n");
801 return -1; 792 return -1;
802 } 793 }
803 ts_st->first_pts_check = 0; 794 ts_st->first_pts_check = 0;
804 795
805 if (st->codec->codec_id == CODEC_ID_H264) { 796 if (st->codec->codec_id == CODEC_ID_H264) {
797 const uint8_t *p = buf, *buf_end = p+size;
798 uint32_t state = -1;
799
806 if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) { 800 if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) {
807 av_log(s, AV_LOG_ERROR, "h264 bitstream malformated\n"); 801 av_log(s, AV_LOG_ERROR, "h264 bitstream malformated, "
802 "no startcode found, use -vbsf h264_mp4toannexb\n");
808 return -1; 803 return -1;
809 } 804 }
810 if (pkt->data[4] != 0x09) { // AUD NAL 805
806 do {
807 p = ff_find_start_code(p, buf_end, &state);
808 //av_log(s, AV_LOG_INFO, "nal %d\n", state & 0x1f);
809 } while (p < buf_end && (state & 0x1f) != 9 &&
810 (state & 0x1f) != 5 && (state & 0x1f) != 1);
811
812 if ((state & 0x1f) != 9) { // AUD NAL
811 data = av_malloc(pkt->size+6); 813 data = av_malloc(pkt->size+6);
812 if (!data) 814 if (!data)
813 return -1; 815 return -1;
814 memcpy(data+6, pkt->data, pkt->size); 816 memcpy(data+6, pkt->data, pkt->size);
815 AV_WB32(data, 0x00000001); 817 AV_WB32(data, 0x00000001);
816 data[4] = 0x09; 818 data[4] = 0x09;
817 data[5] = 0xe0; // any slice type 819 data[5] = 0xe0; // any slice type
818 buf = data; 820 buf = data;
819 size = pkt->size+6; 821 size = pkt->size+6;
820 } 822 }
823 } else if (st->codec->codec_id == CODEC_ID_AAC) {
824 if (pkt->size < 2)
825 return -1;
826 if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
827 ADTSContext *adts = ts_st->adts;
828 int new_size;
829 if (!adts) {
830 av_log(s, AV_LOG_ERROR, "aac bitstream not in adts format "
831 "and extradata missing\n");
832 return -1;
833 }
834 new_size = ADTS_HEADER_SIZE+adts->pce_size+pkt->size;
835 if ((unsigned)new_size >= INT_MAX)
836 return -1;
837 data = av_malloc(new_size);
838 if (!data)
839 return AVERROR_NOMEM;
840 ff_adts_write_frame_header(adts, data, pkt->size, adts->pce_size);
841 if (adts->pce_size) {
842 memcpy(data+ADTS_HEADER_SIZE, adts->pce_data, adts->pce_size);
843 adts->pce_size = 0;
844 }
845 memcpy(data+ADTS_HEADER_SIZE+adts->pce_size, pkt->data, pkt->size);
846 buf = data;
847 size = new_size;
848 }
821 } 849 }
822 850
823 if (st->codec->codec_type != CODEC_TYPE_AUDIO) { 851 if (st->codec->codec_type != CODEC_TYPE_AUDIO) {
824 // for video and subtitle, write a single pes packet 852 // for video and subtitle, write a single pes packet
825 mpegts_write_pes(s, st, buf, size, pts, dts); 853 mpegts_write_pes(s, st, buf, size, pts, dts);
826 av_free(data); 854 av_free(data);
827 return 0; 855 return 0;
828 } 856 }
829 857
830 if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) { 858 if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"), 907 NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
880 "video/x-mpegts", 908 "video/x-mpegts",
881 "ts,m2t", 909 "ts,m2t",
882 sizeof(MpegTSWrite), 910 sizeof(MpegTSWrite),
883 CODEC_ID_MP2, 911 CODEC_ID_MP2,
884 CODEC_ID_MPEG2VIDEO, 912 CODEC_ID_MPEG2VIDEO,
885 mpegts_write_header, 913 mpegts_write_header,
886 mpegts_write_packet, 914 mpegts_write_packet,
887 mpegts_write_end, 915 mpegts_write_end,
888 }; 916 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698