annotate mpeg.c @ 331:4530681af424 libavformat

suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
author bellard
date Tue, 09 Dec 2003 18:06:18 +0000
parents 944c8edaf609
children b0ac206f232d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * MPEG1/2 mux/demux
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 #define MAX_PAYLOAD_SIZE 4096
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
22 //#define DEBUG_SEEK
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 typedef struct {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
25 uint8_t buffer[MAX_PAYLOAD_SIZE];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 int buffer_ptr;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
27 uint8_t id;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 int max_buffer_size; /* in bytes */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 int packet_number;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
30 int64_t start_pts;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
31 int64_t start_dts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 } StreamInfo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 int packet_size; /* required packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 int packet_data_max_size; /* maximum data size inside a packet */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 int packet_number;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 int system_header_freq;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 int mux_rate; /* bitrate in units of 50 bytes/s */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 /* stream info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 int audio_bound;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 int video_bound;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 int is_mpeg2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 int is_vcd;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
46 int scr_stream_index; /* stream from which the system clock is
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
47 computed (VBR case) */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
48 int64_t last_scr; /* current system clock */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 } MpegMuxContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 #define PACK_START_CODE ((unsigned int)0x000001ba)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 #define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 #define SEQUENCE_END_CODE ((unsigned int)0x000001b7)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 #define PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 #define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56 #define ISO_11172_END_CODE ((unsigned int)0x000001b9)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 /* mpeg2 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59 #define PROGRAM_STREAM_MAP 0x1bc
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 #define PRIVATE_STREAM_1 0x1bd
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 #define PADDING_STREAM 0x1be
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 #define PRIVATE_STREAM_2 0x1bf
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 #define AUDIO_ID 0xc0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66 #define VIDEO_ID 0xe0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 276
diff changeset
68 #ifdef CONFIG_ENCODERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 extern AVOutputFormat mpeg1system_mux;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70 extern AVOutputFormat mpeg1vcd_mux;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 extern AVOutputFormat mpeg2vob_mux;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 static int put_pack_header(AVFormatContext *ctx,
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
74 uint8_t *buf, int64_t timestamp)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 MpegMuxContext *s = ctx->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 PutBitContext pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78
276
3dd3646e0164 init_put_bits changed
alex
parents: 242
diff changeset
79 init_put_bits(&pb, buf, 128);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 put_bits(&pb, 32, PACK_START_CODE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 if (s->is_mpeg2) {
174
7d56e9f83fdb Write correct MPEG2-PS streams patch by (mru at users dot sourceforge dot net (Mns Rullgrd))
michaelni
parents: 165
diff changeset
83 put_bits(&pb, 2, 0x1);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 put_bits(&pb, 4, 0x2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 }
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
87 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 put_bits(&pb, 1, 1);
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
89 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 put_bits(&pb, 1, 1);
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
91 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 put_bits(&pb, 1, 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 if (s->is_mpeg2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 /* clock extension */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 put_bits(&pb, 9, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 put_bits(&pb, 1, 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 put_bits(&pb, 1, 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 put_bits(&pb, 22, s->mux_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 put_bits(&pb, 1, 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 if (s->is_mpeg2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 put_bits(&pb, 5, 0x1f); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 put_bits(&pb, 3, 0); /* stuffing length */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 flush_put_bits(&pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 return pbBufPtr(&pb) - pb.buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
109 static int put_system_header(AVFormatContext *ctx, uint8_t *buf)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 MpegMuxContext *s = ctx->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 int size, rate_bound, i, private_stream_coded, id;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 PutBitContext pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114
276
3dd3646e0164 init_put_bits changed
alex
parents: 242
diff changeset
115 init_put_bits(&pb, buf, 128);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 put_bits(&pb, 16, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119 put_bits(&pb, 1, 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 rate_bound = s->mux_rate; /* maximum bit rate of the multiplexed stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 put_bits(&pb, 22, rate_bound);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 put_bits(&pb, 1, 1); /* marker */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 put_bits(&pb, 6, s->audio_bound);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 put_bits(&pb, 1, 1); /* variable bitrate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 put_bits(&pb, 1, 1); /* non constrainted bit stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 put_bits(&pb, 1, 0); /* audio locked */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 put_bits(&pb, 1, 0); /* video locked */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 put_bits(&pb, 1, 1); /* marker */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 put_bits(&pb, 5, s->video_bound);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 put_bits(&pb, 8, 0xff); /* reserved byte */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 /* audio stream info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 private_stream_coded = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 for(i=0;i<ctx->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 StreamInfo *stream = ctx->streams[i]->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 id = stream->id;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 if (id < 0xc0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 /* special case for private streams (AC3 use that) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 if (private_stream_coded)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 continue;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 private_stream_coded = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 id = 0xbd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 put_bits(&pb, 8, id); /* stream ID */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 put_bits(&pb, 2, 3);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 if (id < 0xe0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 /* audio */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 put_bits(&pb, 1, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 put_bits(&pb, 13, stream->max_buffer_size / 128);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 /* video */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 put_bits(&pb, 1, 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 put_bits(&pb, 13, stream->max_buffer_size / 1024);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 flush_put_bits(&pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 size = pbBufPtr(&pb) - pb.buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 /* patch packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 buf[4] = (size - 6) >> 8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 buf[5] = (size - 6) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
166 return size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
169 static int mpeg_mux_init(AVFormatContext *ctx)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
170 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
171 MpegMuxContext *s = ctx->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 int bitrate, i, mpa_id, mpv_id, ac3_id;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174 StreamInfo *stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
175
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 s->packet_number = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 s->is_vcd = (ctx->oformat == &mpeg1vcd_mux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 if (s->is_vcd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181 s->packet_size = 2324; /* VCD packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 s->packet_size = 2048;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 /* startcode(4) + length(2) + flags(1) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
186 s->packet_data_max_size = s->packet_size - 7;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
187 if (s->is_mpeg2)
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
188 s->packet_data_max_size -= 2;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 s->audio_bound = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 s->video_bound = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 mpa_id = AUDIO_ID;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192 ac3_id = 0x80;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 mpv_id = VIDEO_ID;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
194 s->scr_stream_index = -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 for(i=0;i<ctx->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 st = ctx->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 stream = av_mallocz(sizeof(StreamInfo));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 if (!stream)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 st->priv_data = stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202 switch(st->codec.codec_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 case CODEC_TYPE_AUDIO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 if (st->codec.codec_id == CODEC_ID_AC3)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 stream->id = ac3_id++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207 stream->id = mpa_id++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 stream->max_buffer_size = 4 * 1024;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 s->audio_bound++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 case CODEC_TYPE_VIDEO:
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
212 /* by default, video is used for the SCR computation */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
213 if (s->scr_stream_index == -1)
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
214 s->scr_stream_index = i;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 stream->id = mpv_id++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 stream->max_buffer_size = 46 * 1024;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 s->video_bound++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
220 av_abort();
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222 }
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
223 /* if no SCR, use first stream (audio) */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
224 if (s->scr_stream_index == -1)
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
225 s->scr_stream_index = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 /* we increase slightly the bitrate to take into account the
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228 headers. XXX: compute it exactly */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229 bitrate = 2000;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 for(i=0;i<ctx->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 st = ctx->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 bitrate += st->codec.bit_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 if (s->is_vcd || s->is_mpeg2)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 /* every packet */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
238 s->pack_header_freq = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 /* every 2 seconds */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
241 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
291
b19f70a6d60f 1/0 fix by (Tim Allen <tim at proximity dot com dot au>)
michael
parents: 277
diff changeset
242
b19f70a6d60f 1/0 fix by (Tim Allen <tim at proximity dot com dot au>)
michael
parents: 277
diff changeset
243 /* the above seems to make pack_header_freq zero sometimes */
b19f70a6d60f 1/0 fix by (Tim Allen <tim at proximity dot com dot au>)
michael
parents: 277
diff changeset
244 if (s->pack_header_freq == 0)
b19f70a6d60f 1/0 fix by (Tim Allen <tim at proximity dot com dot au>)
michael
parents: 277
diff changeset
245 s->pack_header_freq = 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 if (s->is_mpeg2)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 /* every 200 packets. Need to look at the spec. */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 s->system_header_freq = s->pack_header_freq * 40;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 else if (s->is_vcd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 /* every 40 packets, this is my invention */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 s->system_header_freq = s->pack_header_freq * 40;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 s->system_header_freq = s->pack_header_freq * 5;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256 for(i=0;i<ctx->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 stream = ctx->streams[i]->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 stream->buffer_ptr = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 stream->packet_number = 0;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
260 stream->start_pts = AV_NOPTS_VALUE;
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
261 stream->start_dts = AV_NOPTS_VALUE;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 }
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
263 s->last_scr = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 for(i=0;i<ctx->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 av_free(ctx->streams[i]->priv_data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 return -ENOMEM;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
270 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
272 static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
273 {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
274 put_byte(pb,
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
275 (id << 4) |
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
276 (((timestamp >> 30) & 0x07) << 1) |
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
277 1);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
278 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
279 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
280 }
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
281
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 /* flush the packet on stream stream_index */
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
283 static void flush_packet(AVFormatContext *ctx, int stream_index,
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
284 int64_t pts, int64_t dts, int64_t scr)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 MpegMuxContext *s = ctx->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
288 uint8_t *buf_ptr;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 int size, payload_size, startcode, id, len, stuffing_size, i, header_len;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 49
diff changeset
290 uint8_t buffer[128];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292 id = stream->id;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
293
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 printf("packet ID=%2x PTS=%0.3f\n",
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
296 id, pts / 90000.0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299 buf_ptr = buffer;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 if (((s->packet_number % s->pack_header_freq) == 0)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 /* output pack and systems header if needed */
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
302 size = put_pack_header(ctx, buf_ptr, scr);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 buf_ptr += size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304 if ((s->packet_number % s->system_header_freq) == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 size = put_system_header(ctx, buf_ptr);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306 buf_ptr += size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 size = buf_ptr - buffer;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 put_buffer(&ctx->pb, buffer, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 /* packet header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 if (s->is_mpeg2) {
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
314 header_len = 3;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 } else {
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
316 header_len = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 }
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
318 if (pts != AV_NOPTS_VALUE) {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
319 if (dts != AV_NOPTS_VALUE)
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
320 header_len += 5 + 5;
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
321 else
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
322 header_len += 5;
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
323 } else {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
324 if (!s->is_mpeg2)
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
325 header_len++;
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
326 }
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
327
242
3c299d432ca4 removed invalid sequence end code
bellard
parents: 241
diff changeset
328 payload_size = s->packet_size - (size + 6 + header_len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 if (id < 0xc0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 startcode = PRIVATE_STREAM_1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331 payload_size -= 4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 startcode = 0x100 + id;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 stuffing_size = payload_size - stream->buffer_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 if (stuffing_size < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337 stuffing_size = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
339 put_be32(&ctx->pb, startcode);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341 put_be16(&ctx->pb, payload_size + header_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342 /* stuffing */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
343 for(i=0;i<stuffing_size;i++)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 put_byte(&ctx->pb, 0xff);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
345
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 if (s->is_mpeg2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 put_byte(&ctx->pb, 0x80); /* mpeg2 id */
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
348
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
349 if (pts != AV_NOPTS_VALUE) {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
350 if (dts != AV_NOPTS_VALUE) {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
351 put_byte(&ctx->pb, 0xc0); /* flags */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
352 put_byte(&ctx->pb, header_len - 3);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
353 put_timestamp(&ctx->pb, 0x03, pts);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
354 put_timestamp(&ctx->pb, 0x01, dts);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
355 } else {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
356 put_byte(&ctx->pb, 0x80); /* flags */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
357 put_byte(&ctx->pb, header_len - 3);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
358 put_timestamp(&ctx->pb, 0x02, pts);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
359 }
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
360 } else {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
361 put_byte(&ctx->pb, 0x00); /* flags */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
362 put_byte(&ctx->pb, header_len - 3);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
363 }
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
364 } else {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
365 if (pts != AV_NOPTS_VALUE) {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
366 if (dts != AV_NOPTS_VALUE) {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
367 put_timestamp(&ctx->pb, 0x03, pts);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
368 put_timestamp(&ctx->pb, 0x01, dts);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
369 } else {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
370 put_timestamp(&ctx->pb, 0x02, pts);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
371 }
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
372 } else {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
373 put_byte(&ctx->pb, 0x0f);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
374 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
377 if (startcode == PRIVATE_STREAM_1) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378 put_byte(&ctx->pb, id);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 if (id >= 0x80 && id <= 0xbf) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 /* XXX: need to check AC3 spec */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 put_byte(&ctx->pb, 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382 put_byte(&ctx->pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 put_byte(&ctx->pb, 2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 /* output data */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
388 put_buffer(&ctx->pb, stream->buffer, payload_size - stuffing_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389 put_flush_packet(&ctx->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
390
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
391 /* preserve remaining data */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
392 len = stream->buffer_ptr - payload_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 if (len < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394 len = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 memmove(stream->buffer, stream->buffer + stream->buffer_ptr - len, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
396 stream->buffer_ptr = len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 s->packet_number++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 stream->packet_number++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
402 static int mpeg_mux_write_packet(AVFormatContext *ctx, int stream_index,
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 237
diff changeset
403 const uint8_t *buf, int size, int64_t pts)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
405 MpegMuxContext *s = ctx->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
406 AVStream *st = ctx->streams[stream_index];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
407 StreamInfo *stream = st->priv_data;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
408 int64_t dts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
409 int len;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
410
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
411 /* XXX: system clock should be computed precisely, especially for
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
412 CBR case. The current mode gives at least something coherent */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
413 if (stream_index == s->scr_stream_index)
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
414 s->last_scr = pts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
416 #if 0
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
417 printf("%d: pts=%0.3f scr=%0.3f\n",
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
418 stream_index, pts / 90000.0, s->last_scr / 90000.0);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
419 #endif
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
420
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
421 /* XXX: currently no way to pass dts, will change soon */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
422 dts = AV_NOPTS_VALUE;
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
423
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
424 /* we assume here that pts != AV_NOPTS_VALUE */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
425 if (stream->start_pts == AV_NOPTS_VALUE) {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
426 stream->start_pts = pts;
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
427 stream->start_dts = dts;
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
428 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
429 while (size > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
430 len = s->packet_data_max_size - stream->buffer_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431 if (len > size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432 len = size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 memcpy(stream->buffer + stream->buffer_ptr, buf, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434 stream->buffer_ptr += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
435 buf += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
436 size -= len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
437 while (stream->buffer_ptr >= s->packet_data_max_size) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
438 /* output the packet */
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
439 flush_packet(ctx, stream_index,
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
440 stream->start_pts, stream->start_dts, s->last_scr);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
441 /* Make sure only the FIRST pes packet for this frame has
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
442 a timestamp */
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
443 stream->start_pts = AV_NOPTS_VALUE;
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
444 stream->start_dts = AV_NOPTS_VALUE;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
445 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
446 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 static int mpeg_mux_end(AVFormatContext *ctx)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451 {
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
452 MpegMuxContext *s = ctx->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453 StreamInfo *stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
454 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 /* flush each packet */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457 for(i=0;i<ctx->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 stream = ctx->streams[i]->priv_data;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
459 while (stream->buffer_ptr > 0) {
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
460 flush_packet(ctx, i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, s->last_scr);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463
242
3c299d432ca4 removed invalid sequence end code
bellard
parents: 241
diff changeset
464 /* End header according to MPEG1 systems standard. We do not write
3c299d432ca4 removed invalid sequence end code
bellard
parents: 241
diff changeset
465 it as it is usually not needed by decoders and because it
3c299d432ca4 removed invalid sequence end code
bellard
parents: 241
diff changeset
466 complicates MPEG stream concatenation. */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467 //put_be32(&ctx->pb, ISO_11172_END_CODE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468 //put_flush_packet(&ctx->pb);
237
35231c0be8e5 memleak fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michaelni
parents: 210
diff changeset
469
35231c0be8e5 memleak fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michaelni
parents: 210
diff changeset
470 for(i=0;i<ctx->nb_streams;i++)
35231c0be8e5 memleak fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michaelni
parents: 210
diff changeset
471 av_freep(&ctx->streams[i]->priv_data);
35231c0be8e5 memleak fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michaelni
parents: 210
diff changeset
472
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474 }
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 276
diff changeset
475 #endif //CONFIG_ENCODERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
476
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
477 /*********************************************/
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
478 /* demux code */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
479
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
480 #define MAX_SYNC_SIZE 100000
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
481
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
482 static int mpegps_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
483 {
165
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
484 int code, c, i;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
485
165
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
486 code = 0xff;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
487 /* we search the first start code. If it is a packet start code,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
488 then we decide it is mpeg ps. We do not send highest value to
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
489 give a chance to mpegts */
49
3e7e13e08b27 avoid too many false detections
bellard
parents: 41
diff changeset
490 /* NOTE: the search range was restricted to avoid too many false
3e7e13e08b27 avoid too many false detections
bellard
parents: 41
diff changeset
491 detections */
3e7e13e08b27 avoid too many false detections
bellard
parents: 41
diff changeset
492
3e7e13e08b27 avoid too many false detections
bellard
parents: 41
diff changeset
493 if (p->buf_size < 6)
3e7e13e08b27 avoid too many false detections
bellard
parents: 41
diff changeset
494 return 0;
165
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
495
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
496 for (i = 0; i < 20; i++) {
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
497 c = p->buf[i];
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
498 code = (code << 8) | c;
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
499 if ((code & 0xffffff00) == 0x100) {
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
500 if (code == PACK_START_CODE ||
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
501 code == SYSTEM_HEADER_START_CODE ||
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
502 (code >= 0x1e0 && code <= 0x1ef) ||
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
503 (code >= 0x1c0 && code <= 0x1df) ||
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
504 code == PRIVATE_STREAM_2 ||
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
505 code == PROGRAM_STREAM_MAP ||
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
506 code == PRIVATE_STREAM_1 ||
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
507 code == PADDING_STREAM)
210
0533547fb150 fix MPEG-TS missdetected as MPEG-PS
michaelni
parents: 190
diff changeset
508 return AVPROBE_SCORE_MAX - 2;
165
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
509 else
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
510 return 0;
e4d2f704bf80 - Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents: 65
diff changeset
511 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
512 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
513 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
514 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
515
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
516
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
517 typedef struct MpegDemuxContext {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
518 int header_state;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
519 } MpegDemuxContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
520
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
521 static int mpegps_read_header(AVFormatContext *s,
944c8edaf609 seek support
bellard
parents: 293
diff changeset
522 AVFormatParameters *ap)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
523 {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
524 MpegDemuxContext *m = s->priv_data;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
525 m->header_state = 0xff;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
526 s->ctx_flags |= AVFMTCTX_NOHEADER;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
527
944c8edaf609 seek support
bellard
parents: 293
diff changeset
528 /* no need to do more */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
529 return 0;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
530 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
531
944c8edaf609 seek support
bellard
parents: 293
diff changeset
532 static int64_t get_pts(ByteIOContext *pb, int c)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
533 {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
534 int64_t pts;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
535 int val;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
536
944c8edaf609 seek support
bellard
parents: 293
diff changeset
537 if (c < 0)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
538 c = get_byte(pb);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
539 pts = (int64_t)((c >> 1) & 0x07) << 30;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
540 val = get_be16(pb);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
541 pts |= (int64_t)(val >> 1) << 15;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
542 val = get_be16(pb);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
543 pts |= (int64_t)(val >> 1);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
544 return pts;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
545 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
546
944c8edaf609 seek support
bellard
parents: 293
diff changeset
547 static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
944c8edaf609 seek support
bellard
parents: 293
diff changeset
548 uint32_t *header_state)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
549 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
550 unsigned int state, v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
551 int val, n;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
552
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
553 state = *header_state;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
554 n = *size_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
555 while (n > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
556 if (url_feof(pb))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
557 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
558 v = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
559 n--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
560 if (state == 0x000001) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
561 state = ((state << 8) | v) & 0xffffff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
562 val = state;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
563 goto found;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
564 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
565 state = ((state << 8) | v) & 0xffffff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
566 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
567 val = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
568 found:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
569 *header_state = state;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
570 *size_ptr = n;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
571 return val;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
572 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
573
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
574 /* XXX: optimize */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
575 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
576 {
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
577 int64_t pos, pos_start;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
578 int max_size, start_code;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
579
944c8edaf609 seek support
bellard
parents: 293
diff changeset
580 max_size = *size_ptr;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
581 pos_start = url_ftell(pb);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
582
944c8edaf609 seek support
bellard
parents: 293
diff changeset
583 /* in order to go faster, we fill the buffer */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
584 pos = pos_start - 16386;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
585 if (pos < 0)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
586 pos = 0;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
587 url_fseek(pb, pos, SEEK_SET);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
588 get_byte(pb);
293
62cec412a186 make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents: 291
diff changeset
589
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
590 pos = pos_start;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
591 for(;;) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
592 pos--;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
593 if (pos < 0 || (pos_start - pos) >= max_size) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
594 start_code = -1;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
595 goto the_end;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
596 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
597 url_fseek(pb, pos, SEEK_SET);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
598 start_code = get_be32(pb);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
599 if ((start_code & 0xffffff00) == 0x100)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
600 break;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
601 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
602 the_end:
944c8edaf609 seek support
bellard
parents: 293
diff changeset
603 *size_ptr = pos_start - pos;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
604 return start_code;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
606
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
607 /* read the next (or previous) PES header. Return its position in ppos
944c8edaf609 seek support
bellard
parents: 293
diff changeset
608 (if not NULL), and its start code, pts and dts.
944c8edaf609 seek support
bellard
parents: 293
diff changeset
609 */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
610 static int mpegps_read_pes_header(AVFormatContext *s,
944c8edaf609 seek support
bellard
parents: 293
diff changeset
611 int64_t *ppos, int *pstart_code,
944c8edaf609 seek support
bellard
parents: 293
diff changeset
612 int64_t *ppts, int64_t *pdts, int find_next)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
613 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
614 MpegDemuxContext *m = s->priv_data;
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
615 int len, size, startcode, c, flags, header_len;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
616 int64_t pts, dts, last_pos;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
617
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
618 last_pos = -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
619 redo:
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
620 if (find_next) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
621 /* next start code (should be immediately after) */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
622 m->header_state = 0xff;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
623 size = MAX_SYNC_SIZE;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
624 startcode = find_next_start_code(&s->pb, &size, &m->header_state);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
625 } else {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
626 if (last_pos >= 0)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
627 url_fseek(&s->pb, last_pos, SEEK_SET);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
628 size = MAX_SYNC_SIZE;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
629 startcode = find_prev_start_code(&s->pb, &size);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
630 last_pos = url_ftell(&s->pb) - 4;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
631 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
632 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
633 if (startcode < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
634 return -EIO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
635 if (startcode == PACK_START_CODE)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
636 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
637 if (startcode == SYSTEM_HEADER_START_CODE)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
638 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
639 if (startcode == PADDING_STREAM ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
640 startcode == PRIVATE_STREAM_2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
641 /* skip them */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
642 len = get_be16(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
643 url_fskip(&s->pb, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
644 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
645 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
646 /* find matching stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
647 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
648 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
649 (startcode == 0x1bd)))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
650 goto redo;
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
651 if (ppos) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
652 *ppos = url_ftell(&s->pb) - 4;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
653 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
654 len = get_be16(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
655 pts = AV_NOPTS_VALUE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
656 dts = AV_NOPTS_VALUE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
657 /* stuffing */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
658 for(;;) {
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
659 if (len < 1)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
660 goto redo;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
661 c = get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
662 len--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
663 /* XXX: for mpeg1, should test only bit 7 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
664 if (c != 0xff)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
665 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
666 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
667 if ((c & 0xc0) == 0x40) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
668 /* buffer scale & size */
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
669 if (len < 2)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
670 goto redo;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
671 get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
672 c = get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
673 len -= 2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
674 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
675 if ((c & 0xf0) == 0x20) {
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
676 if (len < 4)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
677 goto redo;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
678 dts = pts = get_pts(&s->pb, c);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
679 len -= 4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
680 } else if ((c & 0xf0) == 0x30) {
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
681 if (len < 9)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
682 goto redo;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
683 pts = get_pts(&s->pb, c);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
684 dts = get_pts(&s->pb, -1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
685 len -= 9;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
686 } else if ((c & 0xc0) == 0x80) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
687 /* mpeg 2 PES */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
688 if ((c & 0x30) != 0) {
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
689 /* Encrypted multiplex not handled */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
690 goto redo;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
691 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
692 flags = get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
693 header_len = get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
694 len -= 2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
695 if (header_len > len)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
696 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
697 if ((flags & 0xc0) == 0x80) {
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
698 dts = pts = get_pts(&s->pb, -1);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
699 if (header_len < 5)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
700 goto redo;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
701 header_len -= 5;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
702 len -= 5;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
703 } if ((flags & 0xc0) == 0xc0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
704 pts = get_pts(&s->pb, -1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
705 dts = get_pts(&s->pb, -1);
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
706 if (header_len < 10)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
707 goto redo;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
708 header_len -= 10;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
709 len -= 10;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
710 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
711 len -= header_len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
712 while (header_len > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
713 get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
714 header_len--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
715 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
716 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
717 if (startcode == 0x1bd) {
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
718 if (len < 1)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
719 goto redo;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
720 startcode = get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
721 len--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
722 if (startcode >= 0x80 && startcode <= 0xbf) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
723 /* audio: skip header */
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
724 if (len < 3)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
725 goto redo;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
726 get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
727 get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
728 get_byte(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
729 len -= 3;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
730 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
731 }
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
732 *pstart_code = startcode;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
733 *ppts = pts;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
734 *pdts = dts;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
735 return len;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
736 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
737
944c8edaf609 seek support
bellard
parents: 293
diff changeset
738 static int mpegps_read_packet(AVFormatContext *s,
944c8edaf609 seek support
bellard
parents: 293
diff changeset
739 AVPacket *pkt)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
740 {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
741 AVStream *st;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
742 int len, startcode, i, type, codec_id;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
743 int64_t pts, dts;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
744
944c8edaf609 seek support
bellard
parents: 293
diff changeset
745 redo:
944c8edaf609 seek support
bellard
parents: 293
diff changeset
746 len = mpegps_read_pes_header(s, NULL, &startcode, &pts, &dts, 1);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
747 if (len < 0)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
748 return len;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
749
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
750 /* now find stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
751 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
752 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
753 if (st->id == startcode)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
754 goto found;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
755 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
756 if (startcode >= 0x1e0 && startcode <= 0x1ef) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
757 type = CODEC_TYPE_VIDEO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
758 codec_id = CODEC_ID_MPEG1VIDEO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
759 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
760 type = CODEC_TYPE_AUDIO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
761 codec_id = CODEC_ID_MP2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
762 } else if (startcode >= 0x80 && startcode <= 0x9f) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
763 type = CODEC_TYPE_AUDIO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
764 codec_id = CODEC_ID_AC3;
41
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
765 } else if (startcode >= 0xa0 && startcode <= 0xbf) {
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
766 type = CODEC_TYPE_AUDIO;
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
767 codec_id = CODEC_ID_PCM_S16BE;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
769 skip:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
770 /* skip packet */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 url_fskip(&s->pb, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 /* no stream found: add a new stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
775 st = av_new_stream(s, startcode);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
776 if (!st)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
777 goto skip;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778 st->codec.codec_type = type;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779 st->codec.codec_id = codec_id;
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
780 if (codec_id != CODEC_ID_PCM_S16BE)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
781 st->need_parsing = 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782 found:
41
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
783 if (startcode >= 0xa0 && startcode <= 0xbf) {
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
784 int b1, freq;
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
785 static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
786
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
787 /* for LPCM, we just skip the header and consider it is raw
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
788 audio data */
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
789 if (len <= 3)
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
790 goto skip;
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
791 get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
792 b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
793 get_byte(&s->pb); /* dynamic range control (0x80 = off) */
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
794 len -= 3;
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
795 freq = (b1 >> 4) & 3;
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
796 st->codec.sample_rate = lpcm_freq_tab[freq];
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
797 st->codec.channels = 1 + (b1 & 7);
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
798 st->codec.bit_rate = st->codec.channels * st->codec.sample_rate * 2;
b892b9f97291 added DVD LPCM decoding support
bellard
parents: 14
diff changeset
799 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
800 av_new_packet(pkt, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
801 get_buffer(&s->pb, pkt->data, pkt->size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
802 pkt->pts = pts;
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
803 pkt->dts = dts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
804 pkt->stream_index = st->index;
331
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
805 #if 0
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
806 printf("%d: pts=%0.3f dts=%0.3f\n",
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
807 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0);
4530681af424 suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents: 310
diff changeset
808 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
809 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
810 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
811
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
812 static int mpegps_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
813 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
814 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
815 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
816
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
817 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
944c8edaf609 seek support
bellard
parents: 293
diff changeset
818 int64_t *ppos, int find_next)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
819 {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
820 int len, startcode;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
821 int64_t pos, pts, dts;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
822
944c8edaf609 seek support
bellard
parents: 293
diff changeset
823 pos = *ppos;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
824 #ifdef DEBUG_SEEK
944c8edaf609 seek support
bellard
parents: 293
diff changeset
825 printf("read_dts: pos=0x%llx next=%d -> ", pos, find_next);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
826 #endif
944c8edaf609 seek support
bellard
parents: 293
diff changeset
827 url_fseek(&s->pb, pos, SEEK_SET);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
828 for(;;) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
829 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts, find_next);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
830 if (len < 0) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
831 #ifdef DEBUG_SEEK
944c8edaf609 seek support
bellard
parents: 293
diff changeset
832 printf("none (ret=%d)\n", len);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
833 #endif
944c8edaf609 seek support
bellard
parents: 293
diff changeset
834 return AV_NOPTS_VALUE;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
835 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
836 if (startcode == s->streams[stream_index]->id &&
944c8edaf609 seek support
bellard
parents: 293
diff changeset
837 dts != AV_NOPTS_VALUE) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
838 break;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
839 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
840 if (find_next) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
841 url_fskip(&s->pb, len);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
842 } else {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
843 url_fseek(&s->pb, pos, SEEK_SET);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
844 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
845 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
846 #ifdef DEBUG_SEEK
944c8edaf609 seek support
bellard
parents: 293
diff changeset
847 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos, dts, dts / 90000.0);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
848 #endif
944c8edaf609 seek support
bellard
parents: 293
diff changeset
849 *ppos = pos;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
850 return dts;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
851 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
852
944c8edaf609 seek support
bellard
parents: 293
diff changeset
853 static int find_stream_index(AVFormatContext *s)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
854 {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
855 int i;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
856 AVStream *st;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
857
944c8edaf609 seek support
bellard
parents: 293
diff changeset
858 if (s->nb_streams <= 0)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
859 return -1;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
860 for(i = 0; i < s->nb_streams; i++) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
861 st = s->streams[i];
944c8edaf609 seek support
bellard
parents: 293
diff changeset
862 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
863 return i;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
864 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
865 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
866 return 0;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
867 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
868
944c8edaf609 seek support
bellard
parents: 293
diff changeset
869 static int mpegps_read_seek(AVFormatContext *s,
944c8edaf609 seek support
bellard
parents: 293
diff changeset
870 int stream_index, int64_t timestamp)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
871 {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
872 int64_t pos_min, pos_max, pos;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
873 int64_t dts_min, dts_max, dts;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
874
944c8edaf609 seek support
bellard
parents: 293
diff changeset
875 timestamp = (timestamp * 90000) / AV_TIME_BASE;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
876
944c8edaf609 seek support
bellard
parents: 293
diff changeset
877 #ifdef DEBUG_SEEK
944c8edaf609 seek support
bellard
parents: 293
diff changeset
878 printf("read_seek: %d %0.3f\n", stream_index, timestamp / 90000.0);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
879 #endif
944c8edaf609 seek support
bellard
parents: 293
diff changeset
880
944c8edaf609 seek support
bellard
parents: 293
diff changeset
881 /* XXX: find stream_index by looking at the first PES packet found */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
882 if (stream_index < 0) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
883 stream_index = find_stream_index(s);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
884 if (stream_index < 0)
944c8edaf609 seek support
bellard
parents: 293
diff changeset
885 return -1;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
886 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
887 pos_min = 0;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
888 dts_min = mpegps_read_dts(s, stream_index, &pos_min, 1);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
889 if (dts_min == AV_NOPTS_VALUE) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
890 /* we can reach this case only if no PTS are present in
944c8edaf609 seek support
bellard
parents: 293
diff changeset
891 the whole stream */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
892 return -1;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
893 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
894 pos_max = url_filesize(url_fileno(&s->pb)) - 1;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
895 dts_max = mpegps_read_dts(s, stream_index, &pos_max, 0);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
896
944c8edaf609 seek support
bellard
parents: 293
diff changeset
897 while (pos_min <= pos_max) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
898 #ifdef DEBUG_SEEK
944c8edaf609 seek support
bellard
parents: 293
diff changeset
899 printf("pos_min=0x%llx pos_max=0x%llx dts_min=%0.3f dts_max=%0.3f\n",
944c8edaf609 seek support
bellard
parents: 293
diff changeset
900 pos_min, pos_max,
944c8edaf609 seek support
bellard
parents: 293
diff changeset
901 dts_min / 90000.0, dts_max / 90000.0);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
902 #endif
944c8edaf609 seek support
bellard
parents: 293
diff changeset
903 if (timestamp <= dts_min) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
904 pos = pos_min;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
905 goto found;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
906 } else if (timestamp >= dts_max) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
907 pos = pos_max;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
908 goto found;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
909 } else {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
910 /* interpolate position (better than dichotomy) */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
911 pos = (int64_t)((double)(pos_max - pos_min) *
944c8edaf609 seek support
bellard
parents: 293
diff changeset
912 (double)(timestamp - dts_min) /
944c8edaf609 seek support
bellard
parents: 293
diff changeset
913 (double)(dts_max - dts_min)) + pos_min;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
914 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
915 #ifdef DEBUG_SEEK
944c8edaf609 seek support
bellard
parents: 293
diff changeset
916 printf("pos=0x%llx\n", pos);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
917 #endif
944c8edaf609 seek support
bellard
parents: 293
diff changeset
918 /* read the next timestamp */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
919 dts = mpegps_read_dts(s, stream_index, &pos, 1);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
920 /* check if we are lucky */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
921 if (dts == AV_NOPTS_VALUE) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
922 /* should never happen */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
923 pos = pos_min;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
924 goto found;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
925 } else if (timestamp == dts) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
926 goto found;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
927 } else if (timestamp < dts) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
928 pos_max = pos;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
929 dts_max = mpegps_read_dts(s, stream_index, &pos_max, 0);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
930 if (dts_max == AV_NOPTS_VALUE) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
931 /* should never happen */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
932 break;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
933 } else if (timestamp >= dts_max) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
934 pos = pos_max;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
935 goto found;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
936 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
937 } else {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
938 pos_min = pos + 1;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
939 dts_min = mpegps_read_dts(s, stream_index, &pos_min, 1);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
940 if (dts_min == AV_NOPTS_VALUE) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
941 /* should never happen */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
942 goto found;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
943 } else if (timestamp <= dts_min) {
944c8edaf609 seek support
bellard
parents: 293
diff changeset
944 goto found;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
945 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
946 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
947 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
948 pos = pos_min;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
949 found:
944c8edaf609 seek support
bellard
parents: 293
diff changeset
950 #ifdef DEBUG_SEEK
944c8edaf609 seek support
bellard
parents: 293
diff changeset
951 pos_min = pos;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
952 dts_min = mpegps_read_dts(s, stream_index, &pos_min, 1);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
953 pos_min++;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
954 dts_max = mpegps_read_dts(s, stream_index, &pos_min, 1);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
955 printf("pos=0x%llx %0.3f<=%0.3f<=%0.3f\n",
944c8edaf609 seek support
bellard
parents: 293
diff changeset
956 pos, dts_min / 90000.0, timestamp / 90000.0, dts_max / 90000.0);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
957 #endif
944c8edaf609 seek support
bellard
parents: 293
diff changeset
958 /* do the seek */
944c8edaf609 seek support
bellard
parents: 293
diff changeset
959 url_fseek(&s->pb, pos, SEEK_SET);
944c8edaf609 seek support
bellard
parents: 293
diff changeset
960 return 0;
944c8edaf609 seek support
bellard
parents: 293
diff changeset
961 }
944c8edaf609 seek support
bellard
parents: 293
diff changeset
962
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 276
diff changeset
963 #ifdef CONFIG_ENCODERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
964 static AVOutputFormat mpeg1system_mux = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
965 "mpeg",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
966 "MPEG1 System format",
14
b167760cd0aa mimetype fixes patch by (Ryutaroh Matsumoto <ryutaroh at it dot ss dot titech dot ac dot jp>)
michaelni
parents: 0
diff changeset
967 "video/mpeg",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
968 "mpg,mpeg",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
969 sizeof(MpegMuxContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
970 CODEC_ID_MP2,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
971 CODEC_ID_MPEG1VIDEO,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
972 mpeg_mux_init,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
973 mpeg_mux_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
974 mpeg_mux_end,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
975 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
976
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
977 static AVOutputFormat mpeg1vcd_mux = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
978 "vcd",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
979 "MPEG1 System format (VCD)",
14
b167760cd0aa mimetype fixes patch by (Ryutaroh Matsumoto <ryutaroh at it dot ss dot titech dot ac dot jp>)
michaelni
parents: 0
diff changeset
980 "video/mpeg",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
981 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
982 sizeof(MpegMuxContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
983 CODEC_ID_MP2,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
984 CODEC_ID_MPEG1VIDEO,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
985 mpeg_mux_init,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
986 mpeg_mux_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
987 mpeg_mux_end,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
988 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
989
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
990 static AVOutputFormat mpeg2vob_mux = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
991 "vob",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
992 "MPEG2 PS format (VOB)",
14
b167760cd0aa mimetype fixes patch by (Ryutaroh Matsumoto <ryutaroh at it dot ss dot titech dot ac dot jp>)
michaelni
parents: 0
diff changeset
993 "video/mpeg",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
994 "vob",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
995 sizeof(MpegMuxContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
996 CODEC_ID_MP2,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
997 CODEC_ID_MPEG1VIDEO,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
998 mpeg_mux_init,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
999 mpeg_mux_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1000 mpeg_mux_end,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1001 };
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 276
diff changeset
1002 #endif //CONFIG_ENCODERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1003
190
94fa5e3367ed exports mpegps_demux
bellard
parents: 178
diff changeset
1004 AVInputFormat mpegps_demux = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1005 "mpeg",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1006 "MPEG PS format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1007 sizeof(MpegDemuxContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1008 mpegps_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1009 mpegps_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1010 mpegps_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1011 mpegps_read_close,
310
944c8edaf609 seek support
bellard
parents: 293
diff changeset
1012 mpegps_read_seek,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1013 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1014
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1015 int mpegps_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1016 {
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 276
diff changeset
1017 #ifdef CONFIG_ENCODERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1018 av_register_output_format(&mpeg1system_mux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1019 av_register_output_format(&mpeg1vcd_mux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1020 av_register_output_format(&mpeg2vob_mux);
277
a313e1080322 disable encoders where appropriate (patch courtesy of BERO
melanson
parents: 276
diff changeset
1021 #endif //CONFIG_ENCODERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1022 av_register_input_format(&mpegps_demux);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1023 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1024 }