annotate mpegtsenc.c @ 5910:536e5527c1e0 libavformat

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 9f349253996d
children 08cd1179a20d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
1 /*
1415
3b00fb8ef8e4 replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents: 1358
diff changeset
2 * MPEG2 transport stream (aka DVB) muxer
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4220
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
16 *
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2893
diff changeset
21
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3719
diff changeset
22 #include "libavutil/bswap.h"
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2893
diff changeset
23 #include "libavutil/crc.h"
4211
5e5654752973 set pts and dts of pes packets exactly according to specs
bcoudurier
parents: 4209
diff changeset
24 #include "libavcodec/mpegvideo.h"
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
25 #include "avformat.h"
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
26 #include "mpegts.h"
5787
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
27 #include "adts.h"
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
28
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
29 /* write DVB SI sections */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
30
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
31 /*********************************************/
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
32 /* mpegts section writer */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
33
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
34 typedef struct MpegTSSection {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
35 int pid;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
36 int cc;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
37 void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
38 void *opaque;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
39 } MpegTSSection;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
40
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
41 typedef struct MpegTSService {
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
42 MpegTSSection pmt; /* MPEG2 pmt table context */
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
43 int sid; /* service ID */
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
44 char *name;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
45 char *provider_name;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
46 int pcr_pid;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
47 int pcr_packet_count;
5115
640c875b3bfe rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents: 4952
diff changeset
48 int pcr_packet_period;
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
49 } MpegTSService;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
50
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
51 typedef struct MpegTSWrite {
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
52 MpegTSSection pat; /* MPEG2 pat table */
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
53 MpegTSSection sdt; /* MPEG2 sdt table context */
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
54 MpegTSService **services;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
55 int sdt_packet_count;
5115
640c875b3bfe rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents: 4952
diff changeset
56 int sdt_packet_period;
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
57 int pat_packet_count;
5115
640c875b3bfe rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents: 4952
diff changeset
58 int pat_packet_period;
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
59 int nb_services;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
60 int onid;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
61 int tsid;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
62 uint64_t cur_pcr;
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
63 int mux_rate; ///< set to 1 when VBR
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
64 } MpegTSWrite;
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
65
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
66 /* NOTE: 4 bytes must be left at the end for the crc32 */
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 996
diff changeset
67 static void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len)
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
68 {
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
69 MpegTSWrite *ts = ((AVFormatContext*)s->opaque)->priv_data;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
70 unsigned int crc;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
71 unsigned char packet[TS_PACKET_SIZE];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
72 const unsigned char *buf_ptr;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
73 unsigned char *q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
74 int first, b, len1, left;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
75
2893
c31c50af40c5 improve CRC API
aurel
parents: 2771
diff changeset
76 crc = bswap_32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, buf, len - 4));
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
77 buf[len - 4] = (crc >> 24) & 0xff;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
78 buf[len - 3] = (crc >> 16) & 0xff;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
79 buf[len - 2] = (crc >> 8) & 0xff;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
80 buf[len - 1] = (crc) & 0xff;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
81
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
82 /* send each packet */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
83 buf_ptr = buf;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
84 while (len > 0) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
85 first = (buf == buf_ptr);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
86 q = packet;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
87 *q++ = 0x47;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
88 b = (s->pid >> 8);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
89 if (first)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
90 b |= 0x40;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
91 *q++ = b;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
92 *q++ = s->pid;
5709
bdcd3e540558 Correctly increment continuity_counter in PCR packets.
cehoyos
parents: 5543
diff changeset
93 s->cc = (s->cc + 1) & 0xf;
3419
e78dfb00b88a fix continuity counter to start at 0
bcoudurier
parents: 3286
diff changeset
94 *q++ = 0x10 | s->cc;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
95 if (first)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
96 *q++ = 0; /* 0 offset */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
97 len1 = TS_PACKET_SIZE - (q - packet);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
98 if (len1 > len)
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
99 len1 = len;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
100 memcpy(q, buf_ptr, len1);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
101 q += len1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
102 /* add known padding data */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
103 left = TS_PACKET_SIZE - (q - packet);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
104 if (left > 0)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
105 memset(q, 0xff, left);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
106
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
107 s->write_packet(s, packet);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
108
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
109 buf_ptr += len1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
110 len -= len1;
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
111
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
112 ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
113 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
114 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
115
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
116 static inline void put16(uint8_t **q_ptr, int val)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
117 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
118 uint8_t *q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
119 q = *q_ptr;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
120 *q++ = val >> 8;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
121 *q++ = val;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
122 *q_ptr = q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
123 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
124
1124
d3aff2c607f9 Add const to (mostly) char* and make some functions static, which aren't used
diego
parents: 996
diff changeset
125 static int mpegts_write_section1(MpegTSSection *s, int tid, int id,
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
126 int version, int sec_num, int last_sec_num,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
127 uint8_t *buf, int len)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
128 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
129 uint8_t section[1024], *q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
130 unsigned int tot_len;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
131
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
132 tot_len = 3 + 5 + len + 4;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
133 /* check if not too big */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
134 if (tot_len > 1024)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
135 return -1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
136
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
137 q = section;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
138 *q++ = tid;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
139 put16(&q, 0xb000 | (len + 5 + 4)); /* 5 byte header + 4 byte CRC */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
140 put16(&q, id);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
141 *q++ = 0xc1 | (version << 1); /* current_next_indicator = 1 */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
142 *q++ = sec_num;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
143 *q++ = last_sec_num;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
144 memcpy(q, buf, len);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
145
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
146 mpegts_write_section(s, section, tot_len);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
147 return 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
148 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
149
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
150 /*********************************************/
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
151 /* mpegts writer */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
153 #define DEFAULT_PMT_START_PID 0x1000
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
154 #define DEFAULT_START_PID 0x0100
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
155 #define DEFAULT_PROVIDER_NAME "FFmpeg"
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
156 #define DEFAULT_SERVICE_NAME "Service01"
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
157
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
158 /* default network id, transport stream and service identifiers */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
159 #define DEFAULT_ONID 0x0001
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
160 #define DEFAULT_TSID 0x0001
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
161 #define DEFAULT_SID 0x0001
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
162
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
163 /* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
164 #define DEFAULT_PES_HEADER_FREQ 16
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
165 #define DEFAULT_PES_PAYLOAD_SIZE ((DEFAULT_PES_HEADER_FREQ - 1) * 184 + 170)
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
166
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
167 /* we retransmit the SI info at this rate */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
168 #define SDT_RETRANS_TIME 500
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
169 #define PAT_RETRANS_TIME 100
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
170 #define PCR_RETRANS_TIME 20
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
171
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
172 typedef struct MpegTSWriteStream {
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
173 struct MpegTSService *service;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
174 int pid; /* stream associated pid */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
175 int cc;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
176 int payload_index;
4915
26708ee9a51d ensure first pts is set, according to specs
bcoudurier
parents: 4914
diff changeset
177 int first_pts_check; ///< first pts check needed
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
178 int64_t payload_pts;
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
179 int64_t payload_dts;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
180 uint8_t payload[DEFAULT_PES_PAYLOAD_SIZE];
5787
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
181 ADTSContext *adts;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
182 } MpegTSWriteStream;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
183
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
184 static void mpegts_write_pat(AVFormatContext *s)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
185 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
186 MpegTSWrite *ts = s->priv_data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
187 MpegTSService *service;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
188 uint8_t data[1012], *q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
189 int i;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
190
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
191 q = data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
192 for(i = 0; i < ts->nb_services; i++) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
193 service = ts->services[i];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
194 put16(&q, service->sid);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
195 put16(&q, 0xe000 | service->pmt.pid);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
196 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
197 mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, 0, 0, 0,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
198 data, q - data);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
199 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
200
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
201 static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
202 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
203 // MpegTSWrite *ts = s->priv_data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
204 uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
205 int val, stream_type, i;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
206
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
207 q = data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
208 put16(&q, 0xe000 | service->pcr_pid);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
209
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
210 program_info_length_ptr = q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
211 q += 2; /* patched after */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
212
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
213 /* put program info here */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
214
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
215 val = 0xf000 | (q - program_info_length_ptr - 2);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
216 program_info_length_ptr[0] = val >> 8;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
217 program_info_length_ptr[1] = val;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
218
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
219 for(i = 0; i < s->nb_streams; i++) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
220 AVStream *st = s->streams[i];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
221 MpegTSWriteStream *ts_st = st->priv_data;
4525
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
222 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL,0);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 785
diff changeset
223 switch(st->codec->codec_id) {
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
224 case CODEC_ID_MPEG1VIDEO:
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
225 case CODEC_ID_MPEG2VIDEO:
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
226 stream_type = STREAM_TYPE_VIDEO_MPEG2;
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
227 break;
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
228 case CODEC_ID_MPEG4:
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
229 stream_type = STREAM_TYPE_VIDEO_MPEG4;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
230 break;
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
231 case CODEC_ID_H264:
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
232 stream_type = STREAM_TYPE_VIDEO_H264;
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
233 break;
3716
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
234 case CODEC_ID_DIRAC:
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
235 stream_type = STREAM_TYPE_VIDEO_DIRAC;
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
236 break;
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
237 case CODEC_ID_MP2:
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
238 case CODEC_ID_MP3:
160
9bde37b1a5ce try to filter _all_ PATs if no SDT could be found patch by (<gbazin at altern dot org>)
michaelni
parents: 152
diff changeset
239 stream_type = STREAM_TYPE_AUDIO_MPEG1;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
240 break;
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
241 case CODEC_ID_AAC:
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
242 stream_type = STREAM_TYPE_AUDIO_AAC;
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
243 break;
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
244 case CODEC_ID_AC3:
5543
fbedfacb36ed revert wrongly commited hunk in r21205
bcoudurier
parents: 5541
diff changeset
245 stream_type = STREAM_TYPE_AUDIO_AC3;
313
622892a75ddb support more codecs in MPEG-TS patch by (mru at kth dot se (M«©ns Rullg«©rd))
michael
parents: 250
diff changeset
246 break;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
247 default:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
248 stream_type = STREAM_TYPE_PRIVATE_DATA;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
249 break;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
250 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
251 *q++ = stream_type;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
252 put16(&q, 0xe000 | ts_st->pid);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
253 desc_length_ptr = q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
254 q += 2; /* patched after */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
255
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
256 /* write optional descriptors here */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 785
diff changeset
257 switch(st->codec->codec_type) {
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
258 case AVMEDIA_TYPE_AUDIO:
4525
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
259 if (lang && strlen(lang->value) == 3) {
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
260 *q++ = 0x0a; /* ISO 639 language descriptor */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
261 *q++ = 4;
4525
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
262 *q++ = lang->value[0];
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
263 *q++ = lang->value[1];
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
264 *q++ = lang->value[2];
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
265 *q++ = 0; /* undefined type */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
266 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
267 break;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
268 case AVMEDIA_TYPE_SUBTITLE:
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
269 {
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
270 const char *language;
4525
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
271 language = lang && strlen(lang->value)==3 ? lang->value : "eng";
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
272 *q++ = 0x59;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
273 *q++ = 8;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
274 *q++ = language[0];
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
275 *q++ = language[1];
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
276 *q++ = language[2];
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
277 *q++ = 0x10; /* normal subtitles (0x20 = if hearing pb) */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
278 put16(&q, 1); /* page id */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
279 put16(&q, 1); /* ancillary page id */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
280 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
281 break;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
282 case AVMEDIA_TYPE_VIDEO:
3716
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
283 if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
284 *q++ = 0x05; /*MPEG-2 registration descriptor*/
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
285 *q++ = 4;
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
286 *q++ = 'd';
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
287 *q++ = 'r';
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
288 *q++ = 'a';
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
289 *q++ = 'c';
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
290 }
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
291 break;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
292 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
293
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
294 val = 0xf000 | (q - desc_length_ptr - 2);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
295 desc_length_ptr[0] = val >> 8;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
296 desc_length_ptr[1] = val;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
297 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
298 mpegts_write_section1(&service->pmt, PMT_TID, service->sid, 0, 0, 0,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
299 data, q - data);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
300 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
301
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
302 /* NOTE: str == NULL is accepted for an empty string */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
303 static void putstr8(uint8_t **q_ptr, const char *str)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
304 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
305 uint8_t *q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
306 int len;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
307
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
308 q = *q_ptr;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
309 if (!str)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
310 len = 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
311 else
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
312 len = strlen(str);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
313 *q++ = len;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
314 memcpy(q, str, len);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
315 q += len;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
316 *q_ptr = q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
317 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
318
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
319 static void mpegts_write_sdt(AVFormatContext *s)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
320 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
321 MpegTSWrite *ts = s->priv_data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
322 MpegTSService *service;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
323 uint8_t data[1012], *q, *desc_list_len_ptr, *desc_len_ptr;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
324 int i, running_status, free_ca_mode, val;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
325
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
326 q = data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
327 put16(&q, ts->onid);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
328 *q++ = 0xff;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
329 for(i = 0; i < ts->nb_services; i++) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
330 service = ts->services[i];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
331 put16(&q, service->sid);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
332 *q++ = 0xfc | 0x00; /* currently no EIT info */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
333 desc_list_len_ptr = q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
334 q += 2;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
335 running_status = 4; /* running */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
336 free_ca_mode = 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
337
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
338 /* write only one descriptor for the service name and provider */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
339 *q++ = 0x48;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
340 desc_len_ptr = q;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
341 q++;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
342 *q++ = 0x01; /* digital television service */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
343 putstr8(&q, service->provider_name);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
344 putstr8(&q, service->name);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
345 desc_len_ptr[0] = q - desc_len_ptr - 1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
346
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
347 /* fill descriptor length */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
348 val = (running_status << 13) | (free_ca_mode << 12) |
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
349 (q - desc_list_len_ptr - 2);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
350 desc_list_len_ptr[0] = val >> 8;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
351 desc_list_len_ptr[1] = val;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
352 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
353 mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, 0, 0, 0,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
354 data, q - data);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
355 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
356
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
357 static MpegTSService *mpegts_add_service(MpegTSWrite *ts,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
358 int sid,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
359 const char *provider_name,
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
360 const char *name)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
361 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
362 MpegTSService *service;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
363
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
364 service = av_mallocz(sizeof(MpegTSService));
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
365 if (!service)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
366 return NULL;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
367 service->pmt.pid = DEFAULT_PMT_START_PID + ts->nb_services - 1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
368 service->sid = sid;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
369 service->provider_name = av_strdup(provider_name);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
370 service->name = av_strdup(name);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
371 service->pcr_pid = 0x1fff;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
372 dynarray_add(&ts->services, &ts->nb_services, service);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
373 return service;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
374 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
375
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
376 static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
377 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
378 AVFormatContext *ctx = s->opaque;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 1838
diff changeset
379 put_buffer(ctx->pb, packet, TS_PACKET_SIZE);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
380 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
381
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
382 static int mpegts_write_header(AVFormatContext *s)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
383 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
384 MpegTSWrite *ts = s->priv_data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
385 MpegTSWriteStream *ts_st;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
386 MpegTSService *service;
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
387 AVStream *st, *pcr_st = NULL;
4525
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
388 AVMetadataTag *title;
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
389 int i;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
390 const char *service_name;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
391
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
392 ts->tsid = DEFAULT_TSID;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
393 ts->onid = DEFAULT_ONID;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
394 /* allocate a single DVB service */
4525
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
395 title = av_metadata_get(s->metadata, "title", NULL, 0);
c66cf692bea0 use new metadata API in mpegts muxer
aurel
parents: 4251
diff changeset
396 service_name = title ? title->value : DEFAULT_SERVICE_NAME;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
397 service = mpegts_add_service(ts, DEFAULT_SID,
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
398 DEFAULT_PROVIDER_NAME, service_name);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
399 service->pmt.write_packet = section_write_packet;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
400 service->pmt.opaque = s;
5782
3b477aba769a Start continuity counter at 0 for pmt as well
bcoudurier
parents: 5781
diff changeset
401 service->pmt.cc = 15;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
402
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
403 ts->pat.pid = PAT_PID;
5709
bdcd3e540558 Correctly increment continuity_counter in PCR packets.
cehoyos
parents: 5543
diff changeset
404 ts->pat.cc = 15; // Initialize at 15 so that it wraps and be equal to 0 for the first packet we write
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
405 ts->pat.write_packet = section_write_packet;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
406 ts->pat.opaque = s;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
407
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
408 ts->sdt.pid = SDT_PID;
5709
bdcd3e540558 Correctly increment continuity_counter in PCR packets.
cehoyos
parents: 5543
diff changeset
409 ts->sdt.cc = 15;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
410 ts->sdt.write_packet = section_write_packet;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
411 ts->sdt.opaque = s;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
412
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
413 /* assign pids to each stream */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
414 for(i = 0;i < s->nb_streams; i++) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
415 st = s->streams[i];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
416 ts_st = av_mallocz(sizeof(MpegTSWriteStream));
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
417 if (!ts_st)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
418 goto fail;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
419 st->priv_data = ts_st;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
420 ts_st->service = service;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
421 ts_st->pid = DEFAULT_START_PID + i;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
422 ts_st->payload_pts = AV_NOPTS_VALUE;
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
423 ts_st->payload_dts = AV_NOPTS_VALUE;
4915
26708ee9a51d ensure first pts is set, according to specs
bcoudurier
parents: 4914
diff changeset
424 ts_st->first_pts_check = 1;
5781
2d93c764dc54 Start continuity counter at 0 for streams
bcoudurier
parents: 5780
diff changeset
425 ts_st->cc = 15;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
426 /* update PCR pid by using the first video stream */
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
427 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
428 service->pcr_pid == 0x1fff) {
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
429 service->pcr_pid = ts_st->pid;
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
430 pcr_st = st;
5219
583eb737b1c4 fix pes overhead computation, patch by Niobos, niobos at dest-unreach dot be
bcoudurier
parents: 5115
diff changeset
431 }
5787
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
432 if (st->codec->codec_id == CODEC_ID_AAC &&
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
433 st->codec->extradata_size > 0) {
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
434 ts_st->adts = av_mallocz(sizeof(*ts_st->adts));
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
435 if (!ts_st->adts)
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
436 return AVERROR_NOMEM;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
437 if (ff_adts_decode_extradata(s, ts_st->adts, st->codec->extradata,
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
438 st->codec->extradata_size) < 0)
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
439 return -1;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
440 }
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
441 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
442
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
443 /* if no video stream, use the first stream as PCR */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
444 if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
445 pcr_st = s->streams[0];
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
446 ts_st = pcr_st->priv_data;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
447 service->pcr_pid = ts_st->pid;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
448 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
449
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
450 ts->mux_rate = s->mux_rate ? s->mux_rate : 1;
4216
de2177071c01 calculate pat, pmt and sdt exact size and adjust total bitrate
bcoudurier
parents: 4215
diff changeset
451
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
452 if (ts->mux_rate > 1) {
5803
405bb9032df6 reindent
bcoudurier
parents: 5787
diff changeset
453 service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME) /
405bb9032df6 reindent
bcoudurier
parents: 5787
diff changeset
454 (TS_PACKET_SIZE * 8 * 1000);
405bb9032df6 reindent
bcoudurier
parents: 5787
diff changeset
455 ts->sdt_packet_period = (ts->mux_rate * SDT_RETRANS_TIME) /
405bb9032df6 reindent
bcoudurier
parents: 5787
diff changeset
456 (TS_PACKET_SIZE * 8 * 1000);
405bb9032df6 reindent
bcoudurier
parents: 5787
diff changeset
457 ts->pat_packet_period = (ts->mux_rate * PAT_RETRANS_TIME) /
405bb9032df6 reindent
bcoudurier
parents: 5787
diff changeset
458 (TS_PACKET_SIZE * 8 * 1000);
5535
dd79e1261e28 move pcr/sdt/pat period computation after ts->mux_rate is set, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5534
diff changeset
459
5803
405bb9032df6 reindent
bcoudurier
parents: 5787
diff changeset
460 ts->cur_pcr = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
461 } else {
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
462 /* Arbitrary values, PAT/PMT could be written on key frames */
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
463 ts->sdt_packet_period = 200;
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
464 ts->pat_packet_period = 40;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
465 if (pcr_st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
466 if (!pcr_st->codec->frame_size) {
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
467 av_log(s, AV_LOG_WARNING, "frame size not set\n");
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
468 service->pcr_packet_period =
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
469 pcr_st->codec->sample_rate/(10*512);
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
470 } else {
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
471 service->pcr_packet_period =
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
472 pcr_st->codec->sample_rate/(10*pcr_st->codec->frame_size);
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
473 }
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
474 } else {
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
475 // max delta PCR 0.1s
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
476 service->pcr_packet_period =
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
477 pcr_st->codec->time_base.den/(10*pcr_st->codec->time_base.num);
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
478 }
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
479 }
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
480
5534
2836866dd7a1 output a pcr as soon as possible, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5533
diff changeset
481 // output a PCR as soon as possible
2836866dd7a1 output a pcr as soon as possible, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5533
diff changeset
482 service->pcr_packet_count = service->pcr_packet_period;
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
483 ts->pat_packet_count = ts->pat_packet_period-1;
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
484 ts->sdt_packet_count = ts->sdt_packet_period-1;
5534
2836866dd7a1 output a pcr as soon as possible, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5533
diff changeset
485
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
486 av_log(s, AV_LOG_INFO,
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
487 "muxrate %d bps, pcr every %d pkts, "
5538
3ad37f4daa76 print more debug info about muxing parameters, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5537
diff changeset
488 "sdt every %d, pat/pmt every %d pkts\n",
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
489 ts->mux_rate, service->pcr_packet_period,
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
490 ts->sdt_packet_period, ts->pat_packet_period);
5538
3ad37f4daa76 print more debug info about muxing parameters, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5537
diff changeset
491
4216
de2177071c01 calculate pat, pmt and sdt exact size and adjust total bitrate
bcoudurier
parents: 4215
diff changeset
492
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 1838
diff changeset
493 put_flush_packet(s->pb);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
494
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
495 return 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
496
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
497 fail:
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
498 for(i = 0;i < s->nb_streams; i++) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
499 st = s->streams[i];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
500 av_free(st->priv_data);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
501 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
502 return -1;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
503 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
504
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
505 /* send SDT, PAT and PMT tables regulary */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
506 static void retransmit_si_info(AVFormatContext *s)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
507 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
508 MpegTSWrite *ts = s->priv_data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
509 int i;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
510
5115
640c875b3bfe rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents: 4952
diff changeset
511 if (++ts->sdt_packet_count == ts->sdt_packet_period) {
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
512 ts->sdt_packet_count = 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
513 mpegts_write_sdt(s);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
514 }
5115
640c875b3bfe rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents: 4952
diff changeset
515 if (++ts->pat_packet_count == ts->pat_packet_period) {
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
516 ts->pat_packet_count = 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
517 mpegts_write_pat(s);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
518 for(i = 0; i < ts->nb_services; i++) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
519 mpegts_write_pmt(s, ts->services[i]);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
520 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
521 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
522 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
523
5536
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
524 /* Write a single null transport stream packet */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
525 static void mpegts_insert_null_packet(AVFormatContext *s)
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
526 {
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
527 MpegTSWrite *ts = s->priv_data;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
528 uint8_t *q;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
529 uint8_t buf[TS_PACKET_SIZE];
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
530
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
531 q = buf;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
532 *q++ = 0x47;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
533 *q++ = 0x00 | 0x1f;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
534 *q++ = 0xff;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
535 *q++ = 0x10;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
536 memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
537 put_buffer(s->pb, buf, TS_PACKET_SIZE);
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
538 ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
539 }
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
540
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
541 /* Write a single transport stream packet with a PCR and no payload */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
542 static void mpegts_insert_pcr_only(AVFormatContext *s, AVStream *st)
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
543 {
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
544 MpegTSWrite *ts = s->priv_data;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
545 MpegTSWriteStream *ts_st = st->priv_data;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
546 uint8_t *q;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
547 uint64_t pcr = ts->cur_pcr;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
548 uint8_t buf[TS_PACKET_SIZE];
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
549
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
550 q = buf;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
551 *q++ = 0x47;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
552 *q++ = ts_st->pid >> 8;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
553 *q++ = ts_st->pid;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
554 *q++ = 0x20 | ts_st->cc; /* Adaptation only */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
555 /* Continuity Count field does not increment (see 13818-1 section 2.4.3.3) */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
556 *q++ = TS_PACKET_SIZE - 5; /* Adaptation Field Length */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
557 *q++ = 0x10; /* Adaptation flags: PCR present */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
558
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
559 /* PCR coded into 6 bytes */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
560 *q++ = pcr >> 25;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
561 *q++ = pcr >> 17;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
562 *q++ = pcr >> 9;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
563 *q++ = pcr >> 1;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
564 *q++ = (pcr & 1) << 7;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
565 *q++ = 0;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
566
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
567 /* stuffing bytes */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
568 memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
569 put_buffer(s->pb, buf, TS_PACKET_SIZE);
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
570 ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate;
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
571 }
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
572
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
573 static void write_pts(uint8_t *q, int fourbits, int64_t pts)
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
574 {
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
575 int val;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
576
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
577 val = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
578 *q++ = val;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
579 val = (((pts >> 15) & 0x7fff) << 1) | 1;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
580 *q++ = val >> 8;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
581 *q++ = val;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
582 val = (((pts) & 0x7fff) << 1) | 1;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
583 *q++ = val >> 8;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
584 *q++ = val;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
585 }
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
586
5537
8b4ac40f9525 update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5536
diff changeset
587 /* Add a pes header to the front of payload, and segment into an integer number of
8b4ac40f9525 update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5536
diff changeset
588 * ts packets. The final ts packet is padded using an over-sized adaptation header
8b4ac40f9525 update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5536
diff changeset
589 * to exactly fill the last ts packet.
8b4ac40f9525 update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5536
diff changeset
590 * NOTE: 'payload' contains a complete PES payload.
8b4ac40f9525 update mpegts_write_pes documentation, patch by Mike Scheutzow, scheutzow at alcatel-lucent dot com
bcoudurier
parents: 5536
diff changeset
591 */
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
592 static void mpegts_write_pes(AVFormatContext *s, AVStream *st,
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
593 const uint8_t *payload, int payload_size,
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
594 int64_t pts, int64_t dts)
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
595 {
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
596 MpegTSWriteStream *ts_st = st->priv_data;
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
597 MpegTSWrite *ts = s->priv_data;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
598 uint8_t buf[TS_PACKET_SIZE];
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
599 uint8_t *q;
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
600 int val, is_start, len, header_len, write_pcr, private_code, flags;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
601 int afc_len, stuffing_len;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
602 int64_t pcr = -1; /* avoid warning */
5536
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
603 int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
604
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
605 is_start = 1;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
606 while (payload_size > 0) {
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
607 retransmit_si_info(s);
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
608
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
609 write_pcr = 0;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
610 if (ts_st->pid == ts_st->service->pcr_pid) {
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
611 if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
612 ts_st->service->pcr_packet_count++;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
613 if (ts_st->service->pcr_packet_count >=
5115
640c875b3bfe rename freq to period which is more correct, patch by Niobos, niobos dot be at gmail dot com
bcoudurier
parents: 4952
diff changeset
614 ts_st->service->pcr_packet_period) {
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
615 ts_st->service->pcr_packet_count = 0;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
616 write_pcr = 1;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
617 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
618 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
619
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
620 if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
621 (dts - (int64_t)ts->cur_pcr) > delay) {
5536
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
622 /* pcr insert gets priority over null packet insert */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
623 if (write_pcr)
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
624 mpegts_insert_pcr_only(s, st);
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
625 else
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
626 mpegts_insert_null_packet(s);
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
627 continue; /* recalculate write_pcr and possibly retransmit si_info */
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
628 }
c13224897684 Insert null packets to keep pcr values correct, patch by Mike Scheutzow,
bcoudurier
parents: 5535
diff changeset
629
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
630 /* prepare packet header */
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
631 q = buf;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
632 *q++ = 0x47;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
633 val = (ts_st->pid >> 8);
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
634 if (is_start)
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
635 val |= 0x40;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
636 *q++ = val;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
637 *q++ = ts_st->pid;
5709
bdcd3e540558 Correctly increment continuity_counter in PCR packets.
cehoyos
parents: 5543
diff changeset
638 ts_st->cc = (ts_st->cc + 1) & 0xf;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
639 *q++ = 0x10 | ts_st->cc | (write_pcr ? 0x20 : 0);
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
640 if (write_pcr) {
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
641 // add 11, pcr references the last byte of program clock reference base
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
642 if (ts->mux_rate > 1)
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
643 pcr = ts->cur_pcr + (4+7)*8*90000LL / ts->mux_rate;
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
644 else
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
645 pcr = dts - delay;
4214
5720e5948e0b warn if dts < pcr which means TS is invalid
bcoudurier
parents: 4213
diff changeset
646 if (dts != AV_NOPTS_VALUE && dts < pcr)
5720e5948e0b warn if dts < pcr which means TS is invalid
bcoudurier
parents: 4213
diff changeset
647 av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
648 *q++ = 7; /* AFC length */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
649 *q++ = 0x10; /* flags: PCR present */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
650 *q++ = pcr >> 25;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
651 *q++ = pcr >> 17;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
652 *q++ = pcr >> 9;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
653 *q++ = pcr >> 1;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
654 *q++ = (pcr & 1) << 7;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
655 *q++ = 0;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
656 }
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
657 if (is_start) {
3716
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
658 int pes_extension = 0;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
659 /* write PES header */
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
660 *q++ = 0x00;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
661 *q++ = 0x00;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
662 *q++ = 0x01;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
663 private_code = 0;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
664 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3716
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
665 if (st->codec->codec_id == CODEC_ID_DIRAC) {
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
666 *q++ = 0xfd;
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
667 } else
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
668 *q++ = 0xe0;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
669 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 785
diff changeset
670 (st->codec->codec_id == CODEC_ID_MP2 ||
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 785
diff changeset
671 st->codec->codec_id == CODEC_ID_MP3)) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
672 *q++ = 0xc0;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
673 } else {
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
674 *q++ = 0xbd;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
675 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
676 private_code = 0x20;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
677 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
678 }
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
679 header_len = 0;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
680 flags = 0;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
681 if (pts != AV_NOPTS_VALUE) {
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
682 header_len += 5;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
683 flags |= 0x80;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
684 }
4913
5d22e1946275 do not write dts if pts is not set
bcoudurier
parents: 4912
diff changeset
685 if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
686 header_len += 5;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
687 flags |= 0x40;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
688 }
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
689 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3716
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
690 st->codec->codec_id == CODEC_ID_DIRAC) {
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
691 /* set PES_extension_flag */
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
692 pes_extension = 1;
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
693 flags |= 0x01;
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
694
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
695 /*
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
696 * One byte for PES2 extension flag +
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
697 * one byte for extension length +
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
698 * one byte for extension id
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
699 */
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
700 header_len += 3;
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
701 }
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
702 len = payload_size + header_len + 3;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
703 if (private_code != 0)
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
704 len++;
4921
fa21da521576 write a single pes for video frames, some proprietary player needs it
bcoudurier
parents: 4915
diff changeset
705 if (len > 0xffff)
fa21da521576 write a single pes for video frames, some proprietary player needs it
bcoudurier
parents: 4915
diff changeset
706 len = 0;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
707 *q++ = len >> 8;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
708 *q++ = len;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
709 val = 0x80;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
710 /* data alignment indicator is required for subtitle data */
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
711 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
712 val |= 0x04;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
713 *q++ = val;
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
714 *q++ = flags;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
715 *q++ = header_len;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
716 if (pts != AV_NOPTS_VALUE) {
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
717 write_pts(q, flags >> 6, pts);
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
718 q += 5;
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
719 }
4913
5d22e1946275 do not write dts if pts is not set
bcoudurier
parents: 4912
diff changeset
720 if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) {
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
721 write_pts(q, 1, dts);
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
722 q += 5;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
723 }
3716
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
724 if (pes_extension && st->codec->codec_id == CODEC_ID_DIRAC) {
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
725 flags = 0x01; /* set PES_extension_flag_2 */
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
726 *q++ = flags;
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
727 *q++ = 0x80 | 0x01; /* marker bit + extension length */
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
728 /*
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
729 * Set the stream id extension flag bit to 0 and
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
730 * write the extended stream id
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
731 */
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
732 *q++ = 0x00 | 0x60;
2ca19db359bd Dirac encapsulation in MPEG-TS
diego
parents: 3424
diff changeset
733 }
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
734 if (private_code != 0)
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
735 *q++ = private_code;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
736 is_start = 0;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
737 }
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
738 /* header size */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
739 header_len = q - buf;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
740 /* data len */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
741 len = TS_PACKET_SIZE - header_len;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
742 if (len > payload_size)
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
743 len = payload_size;
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
744 stuffing_len = TS_PACKET_SIZE - header_len - len;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
745 if (stuffing_len > 0) {
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
746 /* add stuffing with AFC */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
747 if (buf[3] & 0x20) {
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
748 /* stuffing already present: increase its size */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
749 afc_len = buf[4] + 1;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
750 memmove(buf + 4 + afc_len + stuffing_len,
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
751 buf + 4 + afc_len,
785
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
752 header_len - (4 + afc_len));
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
753 buf[4] += stuffing_len;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
754 memset(buf + 4 + afc_len, 0xff, stuffing_len);
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
755 } else {
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
756 /* add stuffing */
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
757 memmove(buf + 4 + stuffing_len, buf + 4, header_len - 4);
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
758 buf[3] |= 0x20;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
759 buf[4] = stuffing_len - 1;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
760 if (stuffing_len >= 2) {
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
761 buf[5] = 0x00;
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
762 memset(buf + 6, 0xff, stuffing_len - 2);
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
763 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
764 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
765 }
e277d8928f49 buggy PCR output (just to keep HW decoders happy) - audio and subtitle language support - 'title' stream field sets the service name - fixed TS packet stuffing code - support for subtitle PES packets
bellard
parents: 693
diff changeset
766 memcpy(buf + TS_PACKET_SIZE - len, payload, len);
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
767 payload += len;
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
768 payload_size -= len;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 1838
diff changeset
769 put_buffer(s->pb, buf, TS_PACKET_SIZE);
4209
020395b83a14 compute pcr more accurately, regression tests need update
bcoudurier
parents: 4201
diff changeset
770 ts->cur_pcr += TS_PACKET_SIZE*8*90000LL/ts->mux_rate;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
771 }
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 1838
diff changeset
772 put_flush_packet(s->pb);
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
773 }
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
774
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 313
diff changeset
775 static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
776 {
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 313
diff changeset
777 AVStream *st = s->streams[pkt->stream_index];
5539
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
778 int size = pkt->size;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 313
diff changeset
779 uint8_t *buf= pkt->data;
4219
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
780 uint8_t *data= NULL;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
781 MpegTSWriteStream *ts_st = st->priv_data;
5784
28885ab1ef1c mpegts vbr muxing, activated when muxing rate is not supplied by the
bcoudurier
parents: 5782
diff changeset
782 const uint64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE)*2;
4220
443927a154f1 use delay for subs and dirac too
bcoudurier
parents: 4219
diff changeset
783 int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE;
443927a154f1 use delay for subs and dirac too
bcoudurier
parents: 4219
diff changeset
784
443927a154f1 use delay for subs and dirac too
bcoudurier
parents: 4219
diff changeset
785 if (pkt->pts != AV_NOPTS_VALUE)
443927a154f1 use delay for subs and dirac too
bcoudurier
parents: 4219
diff changeset
786 pts = pkt->pts + delay;
443927a154f1 use delay for subs and dirac too
bcoudurier
parents: 4219
diff changeset
787 if (pkt->dts != AV_NOPTS_VALUE)
443927a154f1 use delay for subs and dirac too
bcoudurier
parents: 4219
diff changeset
788 dts = pkt->dts + delay;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
789
4915
26708ee9a51d ensure first pts is set, according to specs
bcoudurier
parents: 4914
diff changeset
790 if (ts_st->first_pts_check && pts == AV_NOPTS_VALUE) {
26708ee9a51d ensure first pts is set, according to specs
bcoudurier
parents: 4914
diff changeset
791 av_log(s, AV_LOG_ERROR, "first pts value must set\n");
26708ee9a51d ensure first pts is set, according to specs
bcoudurier
parents: 4914
diff changeset
792 return -1;
26708ee9a51d ensure first pts is set, according to specs
bcoudurier
parents: 4914
diff changeset
793 }
26708ee9a51d ensure first pts is set, according to specs
bcoudurier
parents: 4914
diff changeset
794 ts_st->first_pts_check = 0;
26708ee9a51d ensure first pts is set, according to specs
bcoudurier
parents: 4914
diff changeset
795
4921
fa21da521576 write a single pes for video frames, some proprietary player needs it
bcoudurier
parents: 4915
diff changeset
796 if (st->codec->codec_id == CODEC_ID_H264) {
5786
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
797 const uint8_t *p = buf, *buf_end = p+size;
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
798 uint32_t state = -1;
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
799
4219
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
800 if (pkt->size < 5 || AV_RB32(pkt->data) != 0x0000001) {
5786
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
801 av_log(s, AV_LOG_ERROR, "h264 bitstream malformated, "
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
802 "no startcode found, use -vbsf h264_mp4toannexb\n");
4219
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
803 return -1;
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
804 }
5786
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
805
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
806 do {
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
807 p = ff_find_start_code(p, buf_end, &state);
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
808 //av_log(s, AV_LOG_INFO, "nal %d\n", state & 0x1f);
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
809 } while (p < buf_end && (state & 0x1f) != 9 &&
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
810 (state & 0x1f) != 5 && (state & 0x1f) != 1);
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
811
7d670040187e In mpegts muxer, search for h264 aud nal, it might not be the first nal.
bcoudurier
parents: 5784
diff changeset
812 if ((state & 0x1f) != 9) { // AUD NAL
4219
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
813 data = av_malloc(pkt->size+6);
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
814 if (!data)
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
815 return -1;
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
816 memcpy(data+6, pkt->data, pkt->size);
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
817 AV_WB32(data, 0x00000001);
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
818 data[4] = 0x09;
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
819 data[5] = 0xe0; // any slice type
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
820 buf = data;
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
821 size = pkt->size+6;
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
822 }
5787
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
823 } else if (st->codec->codec_id == CODEC_ID_AAC) {
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
824 if (pkt->size < 2)
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
825 return -1;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
826 if ((AV_RB16(pkt->data) & 0xfff0) != 0xfff0) {
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
827 ADTSContext *adts = ts_st->adts;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
828 int new_size;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
829 if (!adts) {
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
830 av_log(s, AV_LOG_ERROR, "aac bitstream not in adts format "
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
831 "and extradata missing\n");
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
832 return -1;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
833 }
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
834 new_size = ADTS_HEADER_SIZE+adts->pce_size+pkt->size;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
835 if ((unsigned)new_size >= INT_MAX)
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
836 return -1;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
837 data = av_malloc(new_size);
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
838 if (!data)
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
839 return AVERROR_NOMEM;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
840 ff_adts_write_frame_header(adts, data, pkt->size, adts->pce_size);
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
841 if (adts->pce_size) {
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
842 memcpy(data+ADTS_HEADER_SIZE, adts->pce_data, adts->pce_size);
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
843 adts->pce_size = 0;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
844 }
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
845 memcpy(data+ADTS_HEADER_SIZE+adts->pce_size, pkt->data, pkt->size);
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
846 buf = data;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
847 size = new_size;
667736f463b3 In mpegts muxer, write adts header if aac bitstream does not contain it
bcoudurier
parents: 5786
diff changeset
848 }
4211
5e5654752973 set pts and dts of pes packets exactly according to specs
bcoudurier
parents: 4209
diff changeset
849 }
5e5654752973 set pts and dts of pes packets exactly according to specs
bcoudurier
parents: 4209
diff changeset
850
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5804
diff changeset
851 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
4921
fa21da521576 write a single pes for video frames, some proprietary player needs it
bcoudurier
parents: 4915
diff changeset
852 // for video and subtitle, write a single pes packet
fa21da521576 write a single pes for video frames, some proprietary player needs it
bcoudurier
parents: 4915
diff changeset
853 mpegts_write_pes(s, st, buf, size, pts, dts);
4922
2647ebecc2f5 move free data in the video case
bcoudurier
parents: 4921
diff changeset
854 av_free(data);
4921
fa21da521576 write a single pes for video frames, some proprietary player needs it
bcoudurier
parents: 4915
diff changeset
855 return 0;
fa21da521576 write a single pes for video frames, some proprietary player needs it
bcoudurier
parents: 4915
diff changeset
856 }
fa21da521576 write a single pes for video frames, some proprietary player needs it
bcoudurier
parents: 4915
diff changeset
857
5539
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
858 if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) {
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
859 mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
860 ts_st->payload_pts, ts_st->payload_dts);
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
861 ts_st->payload_index = 0;
4952
0be83fd54e7a simplify pes timestamps fetching, based on a patch by corp186, chasedouglas at gmail dot com
bcoudurier
parents: 4951
diff changeset
862 }
0be83fd54e7a simplify pes timestamps fetching, based on a patch by corp186, chasedouglas at gmail dot com
bcoudurier
parents: 4951
diff changeset
863
5539
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
864 if (!ts_st->payload_index) {
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
865 ts_st->payload_pts = pts;
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
866 ts_st->payload_dts = dts;
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
867 }
4219
3bfd8604f480 add aud nal unit if not present in h264 bitstream
bcoudurier
parents: 4217
diff changeset
868
5539
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
869 memcpy(ts_st->payload + ts_st->payload_index, buf, size);
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
870 ts_st->payload_index += size;
445ebebedeaf Do not split audio frames accross pes packets.
bcoudurier
parents: 5538
diff changeset
871
5804
9f349253996d In mpegts muxer, free adts context and temporary data
bcoudurier
parents: 5803
diff changeset
872 av_free(data);
9f349253996d In mpegts muxer, free adts context and temporary data
bcoudurier
parents: 5803
diff changeset
873
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
874 return 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
875 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
876
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
877 static int mpegts_write_end(AVFormatContext *s)
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
878 {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
879 MpegTSWrite *ts = s->priv_data;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
880 MpegTSWriteStream *ts_st;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
881 MpegTSService *service;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
882 AVStream *st;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
883 int i;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
884
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
885 /* flush current packets */
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
886 for(i = 0; i < s->nb_streams; i++) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
887 st = s->streams[i];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
888 ts_st = st->priv_data;
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
889 if (ts_st->payload_index > 0) {
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
890 mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
1838
d1af40ab8ea5 write DTS, based on patch by Luca Abeni, lucabe72 email it
mru
parents: 1415
diff changeset
891 ts_st->payload_pts, ts_st->payload_dts);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
892 }
5804
9f349253996d In mpegts muxer, free adts context and temporary data
bcoudurier
parents: 5803
diff changeset
893 av_freep(&ts_st->adts);
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
894 }
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 1838
diff changeset
895 put_flush_packet(s->pb);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
896
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
897 for(i = 0; i < ts->nb_services; i++) {
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
898 service = ts->services[i];
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
899 av_freep(&service->provider_name);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
900 av_freep(&service->name);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
901 av_free(service);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
902 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
903 av_free(ts->services);
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
904
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
905 return 0;
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
906 }
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
907
1167
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1124
diff changeset
908 AVOutputFormat mpegts_muxer = {
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
909 "mpegts",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3420
diff changeset
910 NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
911 "video/x-mpegts",
3420
8d4e4f414fc7 add pretty common .m2t as ts extension
bcoudurier
parents: 3419
diff changeset
912 "ts,m2t",
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
913 sizeof(MpegTSWrite),
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
914 CODEC_ID_MP2,
250
2d4dcb1d3e21 generate correct PTS in transport stream - use mpeg2 encoder by default
bellard
parents: 241
diff changeset
915 CODEC_ID_MPEG2VIDEO,
152
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
916 mpegts_write_header,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
917 mpegts_write_packet,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
918 mpegts_write_end,
cc03a75cbde4 mpeg ts demux uses DVB SI info and generates correct PTS info - added prototype mpeg ts mux
bellard
parents:
diff changeset
919 };