annotate src/ffmpeg/libavformat/mpeg.c @ 854:aac49941ee8f trunk

[svn] statusicon 0.3: alternative right-click menu with simple playback control commands
author giacomo
date Wed, 14 Mar 2007 07:44:00 -0700
parents e8776388b02a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
808
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1 /*
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2 * MPEG1/2 mux/demux
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
5 * This file is part of FFmpeg.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
6 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
11 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
15 * Lesser General Public License for more details.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
16 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
20 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
21 #include "avformat.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
22 #include "bitstream.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
23 #include "fifo.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
24
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
25 #define MAX_PAYLOAD_SIZE 4096
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
26 //#define DEBUG_SEEK
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
27
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
28 #undef NDEBUG
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
29 #include <assert.h>
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
30
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
31 typedef struct PacketDesc {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
32 int64_t pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
33 int64_t dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
34 int size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
35 int unwritten_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
36 int flags;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
37 struct PacketDesc *next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
38 } PacketDesc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
39
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
40 typedef struct {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
41 AVFifoBuffer fifo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
42 uint8_t id;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
43 int max_buffer_size; /* in bytes */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
44 int buffer_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
45 PacketDesc *predecode_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
46 PacketDesc *premux_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
47 PacketDesc **next_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
48 int packet_number;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
49 uint8_t lpcm_header[3];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
50 int lpcm_align;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
51 int bytes_to_iframe;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
52 int align_iframe;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
53 int64_t vobu_start_pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
54 } StreamInfo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
55
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
56 typedef struct {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
57 int packet_size; /* required packet size */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
58 int packet_number;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
59 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
60 int system_header_freq;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
61 int system_header_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
62 int mux_rate; /* bitrate in units of 50 bytes/s */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
63 /* stream info */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
64 int audio_bound;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
65 int video_bound;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
66 int is_mpeg2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
67 int is_vcd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
68 int is_svcd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
69 int is_dvd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
70 int64_t last_scr; /* current system clock */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
71
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
72 double vcd_padding_bitrate; //FIXME floats
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
73 int64_t vcd_padding_bytes_written;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
74
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
75 } MpegMuxContext;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
76
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
77 #define PACK_START_CODE ((unsigned int)0x000001ba)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
78 #define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
79 #define SEQUENCE_END_CODE ((unsigned int)0x000001b7)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
80 #define PACKET_START_CODE_MASK ((unsigned int)0xffffff00)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
81 #define PACKET_START_CODE_PREFIX ((unsigned int)0x00000100)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
82 #define ISO_11172_END_CODE ((unsigned int)0x000001b9)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
83
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
84 /* mpeg2 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
85 #define PROGRAM_STREAM_MAP 0x1bc
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
86 #define PRIVATE_STREAM_1 0x1bd
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
87 #define PADDING_STREAM 0x1be
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
88 #define PRIVATE_STREAM_2 0x1bf
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
89
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
90
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
91 #define AUDIO_ID 0xc0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
92 #define VIDEO_ID 0xe0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
93 #define AC3_ID 0x80
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
94 #define DTS_ID 0x8a
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
95 #define LPCM_ID 0xa0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
96 #define SUB_ID 0x20
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
97
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
98 #define STREAM_TYPE_VIDEO_MPEG1 0x01
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
99 #define STREAM_TYPE_VIDEO_MPEG2 0x02
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
100 #define STREAM_TYPE_AUDIO_MPEG1 0x03
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
101 #define STREAM_TYPE_AUDIO_MPEG2 0x04
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
102 #define STREAM_TYPE_PRIVATE_SECTION 0x05
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
103 #define STREAM_TYPE_PRIVATE_DATA 0x06
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
104 #define STREAM_TYPE_AUDIO_AAC 0x0f
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
105 #define STREAM_TYPE_VIDEO_MPEG4 0x10
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
106 #define STREAM_TYPE_VIDEO_H264 0x1b
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
107
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
108 #define STREAM_TYPE_AUDIO_AC3 0x81
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
109 #define STREAM_TYPE_AUDIO_DTS 0x8a
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
110
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
111 static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
112
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
113 #ifdef CONFIG_MUXERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
114 AVOutputFormat mpeg1system_muxer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
115 AVOutputFormat mpeg1vcd_muxer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
116 AVOutputFormat mpeg2vob_muxer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
117 AVOutputFormat mpeg2svcd_muxer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
118 AVOutputFormat mpeg2dvd_muxer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
119
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
120 static int put_pack_header(AVFormatContext *ctx,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
121 uint8_t *buf, int64_t timestamp)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
122 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
123 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
124 PutBitContext pb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
125
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
126 init_put_bits(&pb, buf, 128);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
127
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
128 put_bits(&pb, 32, PACK_START_CODE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
129 if (s->is_mpeg2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
130 put_bits(&pb, 2, 0x1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
131 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
132 put_bits(&pb, 4, 0x2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
133 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
134 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
135 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
136 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
137 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
138 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
139 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
140 if (s->is_mpeg2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
141 /* clock extension */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
142 put_bits(&pb, 9, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
143 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
144 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
145 put_bits(&pb, 22, s->mux_rate);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
146 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
147 if (s->is_mpeg2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
148 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
149 put_bits(&pb, 5, 0x1f); /* reserved */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
150 put_bits(&pb, 3, 0); /* stuffing length */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
151 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
152 flush_put_bits(&pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
153 return pbBufPtr(&pb) - pb.buf;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
154 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
155
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
156 static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
157 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
158 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
159 int size, i, private_stream_coded, id;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
160 PutBitContext pb;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
161
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
162 init_put_bits(&pb, buf, 128);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
163
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
164 put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
165 put_bits(&pb, 16, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
166 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
167
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
168 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
169 put_bits(&pb, 1, 1); /* marker */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
170 if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
171 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
172 put_bits(&pb, 6, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
173 } else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
174 put_bits(&pb, 6, s->audio_bound);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
175
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
176 if (s->is_vcd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
177 /* see VCD standard, p. IV-7*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
178 put_bits(&pb, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
179 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
180 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
181 put_bits(&pb, 1, 0); /* variable bitrate*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
182 put_bits(&pb, 1, 0); /* non constrainted bit stream */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
183 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
184
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
185 if (s->is_vcd || s->is_dvd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
186 /* see VCD standard p IV-7 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
187 put_bits(&pb, 1, 1); /* audio locked */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
188 put_bits(&pb, 1, 1); /* video locked */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
189 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
190 put_bits(&pb, 1, 0); /* audio locked */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
191 put_bits(&pb, 1, 0); /* video locked */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
192 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
193
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
194 put_bits(&pb, 1, 1); /* marker */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
195
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
196 if (s->is_vcd && only_for_stream_id==AUDIO_ID) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
197 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
198 put_bits(&pb, 5, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
199 } else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
200 put_bits(&pb, 5, s->video_bound);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
201
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
202 if (s->is_dvd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
203 put_bits(&pb, 1, 0); /* packet_rate_restriction_flag */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
204 put_bits(&pb, 7, 0x7f); /* reserved byte */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
205 } else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
206 put_bits(&pb, 8, 0xff); /* reserved byte */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
207
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
208 /* DVD-Video Stream_bound entries
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
209 id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
210 id (0xB8) audio, maximum P-STD for any MPEG audio (0xC0 to 0xC7) streams. If there are none set to 4096 (32x128). (P-STD_buffer_bound_scale = 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
211 id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
212 id (0xBF) private stream 2, NAV packs, set to 2x1024. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
213 if (s->is_dvd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
214
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
215 int P_STD_max_video = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
216 int P_STD_max_mpeg_audio = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
217 int P_STD_max_mpeg_PS1 = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
218
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
219 for(i=0;i<ctx->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
220 StreamInfo *stream = ctx->streams[i]->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
221
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
222 id = stream->id;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
223 if (id == 0xbd && stream->max_buffer_size > P_STD_max_mpeg_PS1) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
224 P_STD_max_mpeg_PS1 = stream->max_buffer_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
225 } else if (id >= 0xc0 && id <= 0xc7 && stream->max_buffer_size > P_STD_max_mpeg_audio) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
226 P_STD_max_mpeg_audio = stream->max_buffer_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
227 } else if (id == 0xe0 && stream->max_buffer_size > P_STD_max_video) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
228 P_STD_max_video = stream->max_buffer_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
229 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
230 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
231
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
232 /* video */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
233 put_bits(&pb, 8, 0xb9); /* stream ID */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
234 put_bits(&pb, 2, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
235 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
236 put_bits(&pb, 13, P_STD_max_video / 1024);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
237
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
238 /* audio */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
239 if (P_STD_max_mpeg_audio == 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
240 P_STD_max_mpeg_audio = 4096;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
241 put_bits(&pb, 8, 0xb8); /* stream ID */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
242 put_bits(&pb, 2, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
243 put_bits(&pb, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
244 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
245
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
246 /* private stream 1 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
247 put_bits(&pb, 8, 0xbd); /* stream ID */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
248 put_bits(&pb, 2, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
249 put_bits(&pb, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
250 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
251
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
252 /* private stream 2 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
253 put_bits(&pb, 8, 0xbf); /* stream ID */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
254 put_bits(&pb, 2, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
255 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
256 put_bits(&pb, 13, 2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
257 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
258 else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
259 /* audio stream info */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
260 private_stream_coded = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
261 for(i=0;i<ctx->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
262 StreamInfo *stream = ctx->streams[i]->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
263
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
264
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
265 /* For VCDs, only include the stream info for the stream
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
266 that the pack which contains this system belongs to.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
267 (see VCD standard p. IV-7) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
268 if ( !s->is_vcd || stream->id==only_for_stream_id
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
269 || only_for_stream_id==0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
270
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
271 id = stream->id;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
272 if (id < 0xc0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
273 /* special case for private streams (AC3 use that) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
274 if (private_stream_coded)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
275 continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
276 private_stream_coded = 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
277 id = 0xbd;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
278 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
279 put_bits(&pb, 8, id); /* stream ID */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
280 put_bits(&pb, 2, 3);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
281 if (id < 0xe0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
282 /* audio */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
283 put_bits(&pb, 1, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
284 put_bits(&pb, 13, stream->max_buffer_size / 128);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
285 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
286 /* video */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
287 put_bits(&pb, 1, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
288 put_bits(&pb, 13, stream->max_buffer_size / 1024);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
289 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
290 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
291 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
292 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
293
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
294 flush_put_bits(&pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
295 size = pbBufPtr(&pb) - pb.buf;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
296 /* patch packet size */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
297 buf[4] = (size - 6) >> 8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
298 buf[5] = (size - 6) & 0xff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
299
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
300 return size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
301 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
302
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
303 static int get_system_header_size(AVFormatContext *ctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
304 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
305 int buf_index, i, private_stream_coded;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
306 StreamInfo *stream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
307 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
308
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
309 if (s->is_dvd)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
310 return 18; // DVD-Video system headers are 18 bytes fixed length.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
311
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
312 buf_index = 12;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
313 private_stream_coded = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
314 for(i=0;i<ctx->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
315 stream = ctx->streams[i]->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
316 if (stream->id < 0xc0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
317 if (private_stream_coded)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
318 continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
319 private_stream_coded = 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
320 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
321 buf_index += 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
322 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
323 return buf_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
324 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
325
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
326 static int mpeg_mux_init(AVFormatContext *ctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
327 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
328 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
329 int bitrate, i, mpa_id, mpv_id, mps_id, ac3_id, dts_id, lpcm_id, j;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
330 AVStream *st;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
331 StreamInfo *stream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
332 int audio_bitrate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
333 int video_bitrate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
334
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
335 s->packet_number = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
336 s->is_vcd = (ctx->oformat == &mpeg1vcd_muxer);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
337 s->is_svcd = (ctx->oformat == &mpeg2svcd_muxer);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
338 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_muxer || ctx->oformat == &mpeg2svcd_muxer || ctx->oformat == &mpeg2dvd_muxer);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
339 s->is_dvd = (ctx->oformat == &mpeg2dvd_muxer);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
340
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
341 if(ctx->packet_size)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
342 s->packet_size = ctx->packet_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
343 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
344 s->packet_size = 2048;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
345
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
346 s->vcd_padding_bytes_written = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
347 s->vcd_padding_bitrate=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
348
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
349 s->audio_bound = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
350 s->video_bound = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
351 mpa_id = AUDIO_ID;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
352 ac3_id = AC3_ID;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
353 dts_id = DTS_ID;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
354 mpv_id = VIDEO_ID;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
355 mps_id = SUB_ID;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
356 lpcm_id = LPCM_ID;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
357 for(i=0;i<ctx->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
358 st = ctx->streams[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
359 stream = av_mallocz(sizeof(StreamInfo));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
360 if (!stream)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
361 goto fail;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
362 st->priv_data = stream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
363
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
364 av_set_pts_info(st, 64, 1, 90000);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
365
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
366 switch(st->codec->codec_type) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
367 case CODEC_TYPE_AUDIO:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
368 if (st->codec->codec_id == CODEC_ID_AC3) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
369 stream->id = ac3_id++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
370 } else if (st->codec->codec_id == CODEC_ID_DTS) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
371 stream->id = dts_id++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
372 } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
373 stream->id = lpcm_id++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
374 for(j = 0; j < 4; j++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
375 if (lpcm_freq_tab[j] == st->codec->sample_rate)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
376 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
377 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
378 if (j == 4)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
379 goto fail;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
380 if (st->codec->channels > 8)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
381 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
382 stream->lpcm_header[0] = 0x0c;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
383 stream->lpcm_header[1] = (st->codec->channels - 1) | (j << 4);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
384 stream->lpcm_header[2] = 0x80;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
385 stream->lpcm_align = st->codec->channels * 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
386 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
387 stream->id = mpa_id++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
388 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
389
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
390 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
391 Right now it is also used for everything else.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
392 stream->max_buffer_size = 4 * 1024;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
393 s->audio_bound++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
394 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
395 case CODEC_TYPE_VIDEO:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
396 stream->id = mpv_id++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
397 if (st->codec->rc_buffer_size)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
398 stream->max_buffer_size = 6*1024 + st->codec->rc_buffer_size/8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
399 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
400 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
401 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
402 /* see VCD standard, p. IV-7*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
403 stream->max_buffer_size = 46 * 1024;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
404 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
405 /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
406 Right now it is also used for everything else.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
407 stream->max_buffer_size = 230 * 1024;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
408 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
409 s->video_bound++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
410 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
411 case CODEC_TYPE_SUBTITLE:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
412 stream->id = mps_id++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
413 stream->max_buffer_size = 16 * 1024;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
414 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
415 default:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
416 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
417 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
418 av_fifo_init(&stream->fifo, 16);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
419 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
420 bitrate = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
421 audio_bitrate = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
422 video_bitrate = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
423 for(i=0;i<ctx->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
424 int codec_rate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
425 st = ctx->streams[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
426 stream = (StreamInfo*) st->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
427
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
428 if(st->codec->rc_max_rate || stream->id==VIDEO_ID)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
429 codec_rate= st->codec->rc_max_rate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
430 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
431 codec_rate= st->codec->bit_rate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
432
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
433 if(!codec_rate)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
434 codec_rate= (1<<21)*8*50/ctx->nb_streams;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
435
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
436 bitrate += codec_rate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
437
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
438 if (stream->id==AUDIO_ID)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
439 audio_bitrate += codec_rate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
440 else if (stream->id==VIDEO_ID)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
441 video_bitrate += codec_rate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
442 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
443
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
444 if(ctx->mux_rate){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
445 s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
446 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
447 /* we increase slightly the bitrate to take into account the
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
448 headers. XXX: compute it exactly */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
449 bitrate += bitrate*5/100;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
450 bitrate += 10000;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
451 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
452 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
453
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
454 if (s->is_vcd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
455 double overhead_rate;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
456
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
457 /* The VCD standard mandates that the mux_rate field is 3528
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
458 (see standard p. IV-6).
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
459 The value is actually "wrong", i.e. if you calculate
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
460 it using the normal formula and the 75 sectors per second transfer
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
461 rate you get a different value because the real pack size is 2324,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
462 not 2352. But the standard explicitly specifies that the mux_rate
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
463 field in the header must have this value.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
464 // s->mux_rate=2352 * 75 / 50; /* = 3528*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
465
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
466 /* The VCD standard states that the muxed stream must be
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
467 exactly 75 packs / second (the data rate of a single speed cdrom).
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
468 Since the video bitrate (probably 1150000 bits/sec) will be below
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
469 the theoretical maximum we have to add some padding packets
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
470 to make up for the lower data rate.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
471 (cf. VCD standard p. IV-6 )*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
472
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
473 /* Add the header overhead to the data rate.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
474 2279 data bytes per audio pack, 2294 data bytes per video pack*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
475 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
476 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
477 overhead_rate *= 8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
478
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
479 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
480 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
481 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
482
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
483 if (s->is_vcd || s->is_mpeg2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
484 /* every packet */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
485 s->pack_header_freq = 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
486 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
487 /* every 2 seconds */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
488 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
489
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
490 /* the above seems to make pack_header_freq zero sometimes */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
491 if (s->pack_header_freq == 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
492 s->pack_header_freq = 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
493
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
494 if (s->is_mpeg2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
495 /* every 200 packets. Need to look at the spec. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
496 s->system_header_freq = s->pack_header_freq * 40;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
497 else if (s->is_vcd)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
498 /* the standard mandates that there are only two system headers
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
499 in the whole file: one in the first packet of each stream.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
500 (see standard p. IV-7 and IV-8) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
501 s->system_header_freq = 0x7fffffff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
502 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
503 s->system_header_freq = s->pack_header_freq * 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
504
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
505 for(i=0;i<ctx->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
506 stream = ctx->streams[i]->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
507 stream->packet_number = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
508 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
509 s->system_header_size = get_system_header_size(ctx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
510 s->last_scr = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
511 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
512 fail:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
513 for(i=0;i<ctx->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
514 av_free(ctx->streams[i]->priv_data);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
515 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
516 return -ENOMEM;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
517 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
518
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
519 static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
520 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
521 put_byte(pb,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
522 (id << 4) |
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
523 (((timestamp >> 30) & 0x07) << 1) |
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
524 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
525 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
526 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
527 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
528
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
529
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
530 /* return the number of padding bytes that should be inserted into
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
531 the multiplexed stream.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
532 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
533 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
534 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
535 int pad_bytes = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
536
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
537 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
538 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
539 int64_t full_pad_bytes;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
540
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
541 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
542 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
543
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
544 if (pad_bytes<0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
545 /* might happen if we have already padded to a later timestamp. This
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
546 can occur if another stream has already advanced further.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
547 pad_bytes=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
548 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
549
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
550 return pad_bytes;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
551 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
552
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
553
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
554 #if 0 /* unused, remove? */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
555 /* return the exact available payload size for the next packet for
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
556 stream 'stream_index'. 'pts' and 'dts' are only used to know if
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
557 timestamps are needed in the packet header. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
558 static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
559 int64_t pts, int64_t dts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
560 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
561 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
562 int buf_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
563 StreamInfo *stream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
564
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
565 stream = ctx->streams[stream_index]->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
566
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
567 buf_index = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
568 if (((s->packet_number % s->pack_header_freq) == 0)) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
569 /* pack header size */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
570 if (s->is_mpeg2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
571 buf_index += 14;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
572 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
573 buf_index += 12;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
574
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
575 if (s->is_vcd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
576 /* there is exactly one system header for each stream in a VCD MPEG,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
577 One in the very first video packet and one in the very first
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
578 audio packet (see VCD standard p. IV-7 and IV-8).*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
579
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
580 if (stream->packet_number==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
581 /* The system headers refer only to the stream they occur in,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
582 so they have a constant size.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
583 buf_index += 15;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
584
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
585 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
586 if ((s->packet_number % s->system_header_freq) == 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
587 buf_index += s->system_header_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
588 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
589 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
590
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
591 if ((s->is_vcd && stream->packet_number==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
592 || (s->is_svcd && s->packet_number==0))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
593 /* the first pack of each stream contains only the pack header,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
594 the system header and some padding (see VCD standard p. IV-6)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
595 Add the padding size, so that the actual payload becomes 0.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
596 buf_index += s->packet_size - buf_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
597 else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
598 /* packet header size */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
599 buf_index += 6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
600 if (s->is_mpeg2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
601 buf_index += 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
602 if (stream->packet_number==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
603 buf_index += 3; /* PES extension */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
604 buf_index += 1; /* obligatory stuffing byte */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
605 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
606 if (pts != AV_NOPTS_VALUE) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
607 if (dts != pts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
608 buf_index += 5 + 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
609 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
610 buf_index += 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
611
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
612 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
613 if (!s->is_mpeg2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
614 buf_index++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
615 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
616
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
617 if (stream->id < 0xc0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
618 /* AC3/LPCM private data header */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
619 buf_index += 4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
620 if (stream->id >= 0xa0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
621 int n;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
622 buf_index += 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
623 /* NOTE: we round the payload size to an integer number of
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
624 LPCM samples */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
625 n = (s->packet_size - buf_index) % stream->lpcm_align;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
626 if (n)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
627 buf_index += (stream->lpcm_align - n);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
628 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
629 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
630
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
631 if (s->is_vcd && stream->id == AUDIO_ID)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
632 /* The VCD standard demands that 20 zero bytes follow
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
633 each audio packet (see standard p. IV-8).*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
634 buf_index+=20;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
635 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
636 return s->packet_size - buf_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
637 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
638 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
639
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
640 /* Write an MPEG padding packet header. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
641 static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
642 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
643 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
644 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
645
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
646 put_be32(pb, PADDING_STREAM);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
647 put_be16(pb, packet_bytes - 6);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
648 if (!s->is_mpeg2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
649 put_byte(pb, 0x0f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
650 packet_bytes -= 7;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
651 } else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
652 packet_bytes -= 6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
653
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
654 for(i=0;i<packet_bytes;i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
655 put_byte(pb, 0xff);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
656 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
657
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
658 static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
659 int nb_frames=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
660 PacketDesc *pkt_desc= stream->premux_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
661
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
662 while(len>0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
663 if(pkt_desc->size == pkt_desc->unwritten_size)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
664 nb_frames++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
665 len -= pkt_desc->unwritten_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
666 pkt_desc= pkt_desc->next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
667 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
668
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
669 return nb_frames;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
670 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
671
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
672 /* flush the packet on stream stream_index */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
673 static int flush_packet(AVFormatContext *ctx, int stream_index,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
674 int64_t pts, int64_t dts, int64_t scr, int trailer_size)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
675 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
676 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
677 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
678 uint8_t *buf_ptr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
679 int size, payload_size, startcode, id, stuffing_size, i, header_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
680 int packet_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
681 uint8_t buffer[128];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
682 int zero_trail_bytes = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
683 int pad_packet_bytes = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
684 int pes_flags;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
685 int general_pack = 0; /*"general" pack without data specific to one stream?*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
686 int nb_frames;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
687
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
688 id = stream->id;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
689
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
690 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
691 printf("packet ID=%2x PTS=%0.3f\n",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
692 id, pts / 90000.0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
693 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
694
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
695 buf_ptr = buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
696
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
697 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
698 /* output pack and systems header if needed */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
699 size = put_pack_header(ctx, buf_ptr, scr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
700 buf_ptr += size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
701 s->last_scr= scr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
702
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
703 if (s->is_vcd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
704 /* there is exactly one system header for each stream in a VCD MPEG,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
705 One in the very first video packet and one in the very first
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
706 audio packet (see VCD standard p. IV-7 and IV-8).*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
707
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
708 if (stream->packet_number==0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
709 size = put_system_header(ctx, buf_ptr, id);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
710 buf_ptr += size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
711 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
712 } else if (s->is_dvd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
713 if (stream->align_iframe || s->packet_number == 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
714 int PES_bytes_to_fill = s->packet_size - size - 10;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
715
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
716 if (pts != AV_NOPTS_VALUE) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
717 if (dts != pts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
718 PES_bytes_to_fill -= 5 + 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
719 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
720 PES_bytes_to_fill -= 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
721 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
722
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
723 if (stream->bytes_to_iframe == 0 || s->packet_number == 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
724 size = put_system_header(ctx, buf_ptr, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
725 buf_ptr += size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
726 size = buf_ptr - buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
727 put_buffer(&ctx->pb, buffer, size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
728
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
729 put_be32(&ctx->pb, PRIVATE_STREAM_2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
730 put_be16(&ctx->pb, 0x03d4); // length
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
731 put_byte(&ctx->pb, 0x00); // substream ID, 00=PCI
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
732 for (i = 0; i < 979; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
733 put_byte(&ctx->pb, 0x00);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
734
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
735 put_be32(&ctx->pb, PRIVATE_STREAM_2);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
736 put_be16(&ctx->pb, 0x03fa); // length
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
737 put_byte(&ctx->pb, 0x01); // substream ID, 01=DSI
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
738 for (i = 0; i < 1017; i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
739 put_byte(&ctx->pb, 0x00);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
740
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
741 memset(buffer, 0, 128);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
742 buf_ptr = buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
743 s->packet_number++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
744 stream->align_iframe = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
745 scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
746 size = put_pack_header(ctx, buf_ptr, scr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
747 s->last_scr= scr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
748 buf_ptr += size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
749 /* GOP Start */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
750 } else if (stream->bytes_to_iframe < PES_bytes_to_fill) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
751 pad_packet_bytes = PES_bytes_to_fill - stream->bytes_to_iframe;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
752 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
753 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
754 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
755 if ((s->packet_number % s->system_header_freq) == 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
756 size = put_system_header(ctx, buf_ptr, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
757 buf_ptr += size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
758 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
759 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
760 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
761 size = buf_ptr - buffer;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
762 put_buffer(&ctx->pb, buffer, size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
763
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
764 packet_size = s->packet_size - size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
765
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
766 if (s->is_vcd && id == AUDIO_ID)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
767 /* The VCD standard demands that 20 zero bytes follow
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
768 each audio pack (see standard p. IV-8).*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
769 zero_trail_bytes += 20;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
770
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
771 if ((s->is_vcd && stream->packet_number==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
772 || (s->is_svcd && s->packet_number==0)) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
773 /* for VCD the first pack of each stream contains only the pack header,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
774 the system header and lots of padding (see VCD standard p. IV-6).
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
775 In the case of an audio pack, 20 zero bytes are also added at
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
776 the end.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
777 /* For SVCD we fill the very first pack to increase compatibility with
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
778 some DVD players. Not mandated by the standard.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
779 if (s->is_svcd)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
780 general_pack = 1; /* the system header refers to both streams and no stream data*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
781 pad_packet_bytes = packet_size - zero_trail_bytes;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
782 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
783
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
784 packet_size -= pad_packet_bytes + zero_trail_bytes;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
785
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
786 if (packet_size > 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
787
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
788 /* packet header size */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
789 packet_size -= 6;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
790
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
791 /* packet header */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
792 if (s->is_mpeg2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
793 header_len = 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
794 if (stream->packet_number==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
795 header_len += 3; /* PES extension */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
796 header_len += 1; /* obligatory stuffing byte */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
797 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
798 header_len = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
799 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
800 if (pts != AV_NOPTS_VALUE) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
801 if (dts != pts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
802 header_len += 5 + 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
803 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
804 header_len += 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
805 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
806 if (!s->is_mpeg2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
807 header_len++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
808 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
809
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
810 payload_size = packet_size - header_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
811 if (id < 0xc0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
812 startcode = PRIVATE_STREAM_1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
813 payload_size -= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
814 if (id >= 0x40) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
815 payload_size -= 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
816 if (id >= 0xa0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
817 payload_size -= 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
818 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
819 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
820 startcode = 0x100 + id;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
821 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
822
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
823 stuffing_size = payload_size - av_fifo_size(&stream->fifo);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
824
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
825 // first byte doesnt fit -> reset pts/dts + stuffing
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
826 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
827 int timestamp_len=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
828 if(dts != pts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
829 timestamp_len += 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
830 if(pts != AV_NOPTS_VALUE)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
831 timestamp_len += s->is_mpeg2 ? 5 : 4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
832 pts=dts= AV_NOPTS_VALUE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
833 header_len -= timestamp_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
834 if (s->is_dvd && stream->align_iframe) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
835 pad_packet_bytes += timestamp_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
836 packet_size -= timestamp_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
837 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
838 payload_size += timestamp_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
839 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
840 stuffing_size += timestamp_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
841 if(payload_size > trailer_size)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
842 stuffing_size += payload_size - trailer_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
843 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
844
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
845 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) { // can't use padding, so use stuffing
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
846 packet_size += pad_packet_bytes;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
847 payload_size += pad_packet_bytes; // undo the previous adjustment
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
848 if (stuffing_size < 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
849 stuffing_size = pad_packet_bytes;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
850 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
851 stuffing_size += pad_packet_bytes;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
852 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
853 pad_packet_bytes = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
854 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
855
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
856 if (stuffing_size < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
857 stuffing_size = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
858 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
859 pad_packet_bytes += stuffing_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
860 packet_size -= stuffing_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
861 payload_size -= stuffing_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
862 stuffing_size = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
863 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
864
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
865 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
866
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
867 put_be32(&ctx->pb, startcode);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
868
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
869 put_be16(&ctx->pb, packet_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
870
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
871 if (!s->is_mpeg2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
872 for(i=0;i<stuffing_size;i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
873 put_byte(&ctx->pb, 0xff);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
874
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
875 if (s->is_mpeg2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
876 put_byte(&ctx->pb, 0x80); /* mpeg2 id */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
877
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
878 pes_flags=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
879
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
880 if (pts != AV_NOPTS_VALUE) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
881 pes_flags |= 0x80;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
882 if (dts != pts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
883 pes_flags |= 0x40;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
884 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
885
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
886 /* Both the MPEG-2 and the SVCD standards demand that the
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
887 P-STD_buffer_size field be included in the first packet of
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
888 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
889 and MPEG-2 standard 2.7.7) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
890 if (stream->packet_number == 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
891 pes_flags |= 0x01;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
892
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
893 put_byte(&ctx->pb, pes_flags); /* flags */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
894 put_byte(&ctx->pb, header_len - 3 + stuffing_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
895
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
896 if (pes_flags & 0x80) /*write pts*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
897 put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
898 if (pes_flags & 0x40) /*write dts*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
899 put_timestamp(&ctx->pb, 0x01, dts);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
900
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
901 if (pes_flags & 0x01) { /*write pes extension*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
902 put_byte(&ctx->pb, 0x10); /* flags */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
903
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
904 /* P-STD buffer info */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
905 if (id == AUDIO_ID)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
906 put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
907 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
908 put_be16(&ctx->pb, 0x6000 | stream->max_buffer_size/1024);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
909 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
910
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
911 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
912 if (pts != AV_NOPTS_VALUE) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
913 if (dts != pts) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
914 put_timestamp(&ctx->pb, 0x03, pts);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
915 put_timestamp(&ctx->pb, 0x01, dts);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
916 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
917 put_timestamp(&ctx->pb, 0x02, pts);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
918 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
919 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
920 put_byte(&ctx->pb, 0x0f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
921 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
922 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
923
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
924 if (s->is_mpeg2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
925 /* special stuffing byte that is always written
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
926 to prevent accidental generation of start codes. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
927 put_byte(&ctx->pb, 0xff);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
928
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
929 for(i=0;i<stuffing_size;i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
930 put_byte(&ctx->pb, 0xff);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
931 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
932
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
933 if (startcode == PRIVATE_STREAM_1) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
934 put_byte(&ctx->pb, id);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
935 if (id >= 0xa0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
936 /* LPCM (XXX: check nb_frames) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
937 put_byte(&ctx->pb, 7);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
938 put_be16(&ctx->pb, 4); /* skip 3 header bytes */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
939 put_byte(&ctx->pb, stream->lpcm_header[0]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
940 put_byte(&ctx->pb, stream->lpcm_header[1]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
941 put_byte(&ctx->pb, stream->lpcm_header[2]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
942 } else if (id >= 0x40) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
943 /* AC3 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
944 put_byte(&ctx->pb, nb_frames);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
945 put_be16(&ctx->pb, trailer_size+1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
946 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
947 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
948
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
949 /* output data */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
950 if(av_fifo_generic_read(&stream->fifo, payload_size - stuffing_size, &put_buffer, &ctx->pb) < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
951 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
952 stream->bytes_to_iframe -= payload_size - stuffing_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
953 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
954 payload_size=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
955 stuffing_size= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
956 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
957
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
958 if (pad_packet_bytes > 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
959 put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
960
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
961 for(i=0;i<zero_trail_bytes;i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
962 put_byte(&ctx->pb, 0x00);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
963
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
964 put_flush_packet(&ctx->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
965
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
966 s->packet_number++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
967
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
968 /* only increase the stream packet number if this pack actually contains
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
969 something that is specific to this stream! I.e. a dedicated header
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
970 or some data.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
971 if (!general_pack)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
972 stream->packet_number++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
973
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
974 return payload_size - stuffing_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
975 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
976
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
977 static void put_vcd_padding_sector(AVFormatContext *ctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
978 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
979 /* There are two ways to do this padding: writing a sector/pack
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
980 of 0 values, or writing an MPEG padding pack. Both seem to
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
981 work with most decoders, BUT the VCD standard only allows a 0-sector
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
982 (see standard p. IV-4, IV-5).
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
983 So a 0-sector it is...*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
984
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
985 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
986 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
987
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
988 for(i=0;i<s->packet_size;i++)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
989 put_byte(&ctx->pb, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
990
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
991 s->vcd_padding_bytes_written += s->packet_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
992
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
993 put_flush_packet(&ctx->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
994
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
995 /* increasing the packet number is correct. The SCR of the following packs
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
996 is calculated from the packet_number and it has to include the padding
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
997 sector (it represents the sector index, not the MPEG pack index)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
998 (see VCD standard p. IV-6)*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
999 s->packet_number++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1000 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1001
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1002 #if 0 /* unused, remove? */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1003 static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1004 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1005 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1006 int64_t scr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1007
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1008 /* Since the data delivery rate is constant, SCR is computed
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1009 using the formula C + i * 1200 where C is the start constant
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1010 and i is the pack index.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1011 It is recommended that SCR 0 is at the beginning of the VCD front
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1012 margin (a sequence of empty Form 2 sectors on the CD).
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1013 It is recommended that the front margin is 30 sectors long, so
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1014 we use C = 30*1200 = 36000
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1015 (Note that even if the front margin is not 30 sectors the file
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1016 will still be correct according to the standard. It just won't have
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1017 the "recommended" value).*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1018 scr = 36000 + s->packet_number * 1200;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1019
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1020 return scr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1021 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1022 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1023
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1024 static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1025 // MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1026 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1027
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1028 for(i=0; i<ctx->nb_streams; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1029 AVStream *st = ctx->streams[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1030 StreamInfo *stream = st->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1031 PacketDesc *pkt_desc= stream->predecode_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1032
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1033 while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1034 if(stream->buffer_index < pkt_desc->size ||
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1035 stream->predecode_packet == stream->premux_packet){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1036 av_log(ctx, AV_LOG_ERROR, "buffer underflow\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1037 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1038 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1039 stream->buffer_index -= pkt_desc->size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1040
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1041 stream->predecode_packet= pkt_desc->next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1042 av_freep(&pkt_desc);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1043 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1044 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1045
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1046 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1047 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1048
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1049 static int output_packet(AVFormatContext *ctx, int flush){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1050 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1051 AVStream *st;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1052 StreamInfo *stream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1053 int i, avail_space, es_size, trailer_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1054 int best_i= -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1055 int best_score= INT_MIN;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1056 int ignore_constraints=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1057 int64_t scr= s->last_scr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1058 PacketDesc *timestamp_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1059 const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1060
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1061 retry:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1062 for(i=0; i<ctx->nb_streams; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1063 AVStream *st = ctx->streams[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1064 StreamInfo *stream = st->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1065 const int avail_data= av_fifo_size(&stream->fifo);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1066 const int space= stream->max_buffer_size - stream->buffer_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1067 int rel_space= 1024*space / stream->max_buffer_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1068 PacketDesc *next_pkt= stream->premux_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1069
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1070 /* for subtitle, a single PES packet must be generated,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1071 so we flush after every single subtitle packet */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1072 if(s->packet_size > avail_data && !flush
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1073 && st->codec->codec_type != CODEC_TYPE_SUBTITLE)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1074 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1075 if(avail_data==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1076 continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1077 assert(avail_data>0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1078
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1079 if(space < s->packet_size && !ignore_constraints)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1080 continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1081
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1082 if(next_pkt && next_pkt->dts - scr > max_delay)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1083 continue;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1084
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1085 if(rel_space > best_score){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1086 best_score= rel_space;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1087 best_i = i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1088 avail_space= space;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1089 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1090 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1091
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1092 if(best_i < 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1093 int64_t best_dts= INT64_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1094
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1095 for(i=0; i<ctx->nb_streams; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1096 AVStream *st = ctx->streams[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1097 StreamInfo *stream = st->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1098 PacketDesc *pkt_desc= stream->predecode_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1099 if(pkt_desc && pkt_desc->dts < best_dts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1100 best_dts= pkt_desc->dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1101 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1102
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1103 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1104 av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1105 scr/90000.0, best_dts/90000.0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1106 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1107 if(best_dts == INT64_MAX)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1108 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1109
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1110 if(scr >= best_dts+1 && !ignore_constraints){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1111 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1112 ignore_constraints= 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1113 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1114 scr= FFMAX(best_dts+1, scr);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1115 if(remove_decoded_packets(ctx, scr) < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1116 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1117 goto retry;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1118 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1119
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1120 assert(best_i >= 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1121
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1122 st = ctx->streams[best_i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1123 stream = st->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1124
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1125 assert(av_fifo_size(&stream->fifo) > 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1126
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1127 assert(avail_space >= s->packet_size || ignore_constraints);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1128
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1129 timestamp_packet= stream->premux_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1130 if(timestamp_packet->unwritten_size == timestamp_packet->size){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1131 trailer_size= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1132 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1133 trailer_size= timestamp_packet->unwritten_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1134 timestamp_packet= timestamp_packet->next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1135 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1136
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1137 if(timestamp_packet){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1138 //av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f scr:%f stream:%d\n", timestamp_packet->dts/90000.0, timestamp_packet->pts/90000.0, scr/90000.0, best_i);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1139 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1140 }else{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1141 assert(av_fifo_size(&stream->fifo) == trailer_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1142 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1143 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1144
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1145 if (s->is_vcd) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1146 /* Write one or more padding sectors, if necessary, to reach
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1147 the constant overall bitrate.*/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1148 int vcd_pad_bytes;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1149
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1150 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1151 put_vcd_padding_sector(ctx);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1152 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1153 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1154 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1155
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1156 stream->buffer_index += es_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1157 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1158
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1159 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1160 es_size -= stream->premux_packet->unwritten_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1161 stream->premux_packet= stream->premux_packet->next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1162 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1163 if(es_size)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1164 stream->premux_packet->unwritten_size -= es_size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1165
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1166 if(remove_decoded_packets(ctx, s->last_scr) < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1167 return -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1168
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1169 return 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1170 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1171
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1172 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1173 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1174 MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1175 int stream_index= pkt->stream_index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1176 int size= pkt->size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1177 uint8_t *buf= pkt->data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1178 AVStream *st = ctx->streams[stream_index];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1179 StreamInfo *stream = st->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1180 int64_t pts, dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1181 PacketDesc *pkt_desc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1182 const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1183 const int is_iframe = st->codec->codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1184
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1185 pts= pkt->pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1186 dts= pkt->dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1187
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1188 if(pts != AV_NOPTS_VALUE) pts += preload;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1189 if(dts != AV_NOPTS_VALUE) dts += preload;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1190
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1191 //av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n", dts/90000.0, pts/90000.0, pkt->flags, pkt->stream_index, pts != AV_NOPTS_VALUE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1192 if (!stream->premux_packet)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1193 stream->next_packet = &stream->premux_packet;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1194 *stream->next_packet=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1195 pkt_desc= av_mallocz(sizeof(PacketDesc));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1196 pkt_desc->pts= pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1197 pkt_desc->dts= dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1198 pkt_desc->unwritten_size=
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1199 pkt_desc->size= size;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1200 if(!stream->predecode_packet)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1201 stream->predecode_packet= pkt_desc;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1202 stream->next_packet= &pkt_desc->next;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1203
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1204 av_fifo_realloc(&stream->fifo, av_fifo_size(&stream->fifo) + size + 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1205
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1206 if (s->is_dvd){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1207 if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1208 stream->bytes_to_iframe = av_fifo_size(&stream->fifo);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1209 stream->align_iframe = 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1210 stream->vobu_start_pts = pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1211 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1212 stream->align_iframe = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1213 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1214 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1215
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1216 av_fifo_write(&stream->fifo, buf, size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1217
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1218 for(;;){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1219 int ret= output_packet(ctx, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1220 if(ret<=0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1221 return ret;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1222 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1223 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1224
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1225 static int mpeg_mux_end(AVFormatContext *ctx)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1226 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1227 // MpegMuxContext *s = ctx->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1228 StreamInfo *stream;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1229 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1230
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1231 for(;;){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1232 int ret= output_packet(ctx, 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1233 if(ret<0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1234 return ret;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1235 else if(ret==0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1236 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1237 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1238
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1239 /* End header according to MPEG1 systems standard. We do not write
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1240 it as it is usually not needed by decoders and because it
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1241 complicates MPEG stream concatenation. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1242 //put_be32(&ctx->pb, ISO_11172_END_CODE);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1243 //put_flush_packet(&ctx->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1244
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1245 for(i=0;i<ctx->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1246 stream = ctx->streams[i]->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1247
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1248 assert(av_fifo_size(&stream->fifo) == 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1249 av_fifo_free(&stream->fifo);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1250 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1251 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1252 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1253 #endif //CONFIG_MUXERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1254
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1255 /*********************************************/
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1256 /* demux code */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1257
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1258 #define MAX_SYNC_SIZE 100000
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1259
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1260 static int cdxa_probe(AVProbeData *p)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1261 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1262 /* check file header */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1263 if (p->buf_size <= 32)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1264 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1265 if (p->buf[0] == 'R' && p->buf[1] == 'I' &&
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1266 p->buf[2] == 'F' && p->buf[3] == 'F' &&
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1267 p->buf[8] == 'C' && p->buf[9] == 'D' &&
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1268 p->buf[10] == 'X' && p->buf[11] == 'A')
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1269 return AVPROBE_SCORE_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1270 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1271 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1272 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1273
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1274 static int mpegps_probe(AVProbeData *p)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1275 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1276 uint32_t code= -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1277 int sys=0, pspack=0, priv1=0, vid=0, audio=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1278 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1279 int score=0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1280
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1281 score = cdxa_probe(p);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1282 if (score > 0) return score;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1283
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1284 /* Search for MPEG stream */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1285 for(i=0; i<p->buf_size; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1286 code = (code<<8) + p->buf[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1287 if ((code & 0xffffff00) == 0x100) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1288 if(code == SYSTEM_HEADER_START_CODE) sys++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1289 else if(code == PRIVATE_STREAM_1) priv1++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1290 else if(code == PACK_START_CODE) pspack++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1291 else if((code & 0xf0) == VIDEO_ID) vid++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1292 else if((code & 0xe0) == AUDIO_ID) audio++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1293 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1294 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1295
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1296 if(vid || audio) /* invalid VDR files nd short PES streams */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1297 score= AVPROBE_SCORE_MAX/4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1298
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1299 //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d\n", sys, priv1, pspack,vid, audio);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1300 if(sys && sys*9 <= pspack*10)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1301 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1302 if((priv1 || vid || audio) && (priv1+vid+audio)*9 <= pspack*10)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1303 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1304 if((!!vid ^ !!audio) && (audio+vid > 1) && !sys && !pspack) /* PES stream */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1305 return AVPROBE_SCORE_MAX/2+2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1306
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1307 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1308 return score;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1309 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1310
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1311
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1312 typedef struct MpegDemuxContext {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1313 int32_t header_state;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1314 unsigned char psm_es_type[256];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1315 } MpegDemuxContext;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1316
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1317 static int mpegps_read_header(AVFormatContext *s,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1318 AVFormatParameters *ap)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1319 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1320 MpegDemuxContext *m = s->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1321 m->header_state = 0xff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1322 s->ctx_flags |= AVFMTCTX_NOHEADER;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1323
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1324 /* no need to do more */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1325 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1326 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1327
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1328 static int64_t get_pts(ByteIOContext *pb, int c)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1329 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1330 int64_t pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1331 int val;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1332
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1333 if (c < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1334 c = get_byte(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1335 pts = (int64_t)((c >> 1) & 0x07) << 30;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1336 val = get_be16(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1337 pts |= (int64_t)(val >> 1) << 15;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1338 val = get_be16(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1339 pts |= (int64_t)(val >> 1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1340 return pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1341 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1342
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1343 static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1344 int32_t *header_state)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1345 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1346 unsigned int state, v;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1347 int val, n;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1348
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1349 state = *header_state;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1350 n = *size_ptr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1351 while (n > 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1352 if (url_feof(pb))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1353 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1354 v = get_byte(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1355 n--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1356 if (state == 0x000001) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1357 state = ((state << 8) | v) & 0xffffff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1358 val = state;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1359 goto found;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1360 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1361 state = ((state << 8) | v) & 0xffffff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1362 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1363 val = -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1364 found:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1365 *header_state = state;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1366 *size_ptr = n;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1367 return val;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1368 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1369
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1370 #if 0 /* unused, remove? */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1371 /* XXX: optimize */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1372 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1373 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1374 int64_t pos, pos_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1375 int max_size, start_code;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1376
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1377 max_size = *size_ptr;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1378 pos_start = url_ftell(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1379
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1380 /* in order to go faster, we fill the buffer */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1381 pos = pos_start - 16386;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1382 if (pos < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1383 pos = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1384 url_fseek(pb, pos, SEEK_SET);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1385 get_byte(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1386
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1387 pos = pos_start;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1388 for(;;) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1389 pos--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1390 if (pos < 0 || (pos_start - pos) >= max_size) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1391 start_code = -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1392 goto the_end;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1393 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1394 url_fseek(pb, pos, SEEK_SET);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1395 start_code = get_be32(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1396 if ((start_code & 0xffffff00) == 0x100)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1397 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1398 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1399 the_end:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1400 *size_ptr = pos_start - pos;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1401 return start_code;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1402 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1403 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1404
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1405 /**
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1406 * Extracts stream types from a program stream map
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1407 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1408 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1409 * @return number of bytes occupied by PSM in the bitstream
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1410 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1411 static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1412 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1413 int psm_length, ps_info_length, es_map_length;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1414
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1415 psm_length = get_be16(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1416 get_byte(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1417 get_byte(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1418 ps_info_length = get_be16(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1419
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1420 /* skip program_stream_info */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1421 url_fskip(pb, ps_info_length);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1422 es_map_length = get_be16(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1423
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1424 /* at least one es available? */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1425 while (es_map_length >= 4){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1426 unsigned char type = get_byte(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1427 unsigned char es_id = get_byte(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1428 uint16_t es_info_length = get_be16(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1429 /* remember mapping from stream id to stream type */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1430 m->psm_es_type[es_id] = type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1431 /* skip program_stream_info */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1432 url_fskip(pb, es_info_length);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1433 es_map_length -= 4 + es_info_length;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1434 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1435 get_be32(pb); /* crc32 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1436 return 2 + psm_length;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1437 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1438
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1439 /* read the next PES header. Return its position in ppos
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1440 (if not NULL), and its start code, pts and dts.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1441 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1442 static int mpegps_read_pes_header(AVFormatContext *s,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1443 int64_t *ppos, int *pstart_code,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1444 int64_t *ppts, int64_t *pdts)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1445 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1446 MpegDemuxContext *m = s->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1447 int len, size, startcode, c, flags, header_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1448 int64_t pts, dts, last_pos;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1449
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1450 last_pos = -1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1451 redo:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1452 /* next start code (should be immediately after) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1453 m->header_state = 0xff;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1454 size = MAX_SYNC_SIZE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1455 startcode = find_next_start_code(&s->pb, &size, &m->header_state);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1456 //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb));
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1457 if (startcode < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1458 return AVERROR_IO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1459 if (startcode == PACK_START_CODE)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1460 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1461 if (startcode == SYSTEM_HEADER_START_CODE)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1462 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1463 if (startcode == PADDING_STREAM ||
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1464 startcode == PRIVATE_STREAM_2) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1465 /* skip them */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1466 len = get_be16(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1467 url_fskip(&s->pb, len);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1468 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1469 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1470 if (startcode == PROGRAM_STREAM_MAP) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1471 mpegps_psm_parse(m, &s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1472 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1473 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1474
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1475 /* find matching stream */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1476 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1477 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1478 (startcode == 0x1bd)))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1479 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1480 if (ppos) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1481 *ppos = url_ftell(&s->pb) - 4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1482 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1483 len = get_be16(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1484 pts = AV_NOPTS_VALUE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1485 dts = AV_NOPTS_VALUE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1486 /* stuffing */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1487 for(;;) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1488 if (len < 1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1489 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1490 c = get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1491 len--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1492 /* XXX: for mpeg1, should test only bit 7 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1493 if (c != 0xff)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1494 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1495 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1496 if ((c & 0xc0) == 0x40) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1497 /* buffer scale & size */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1498 if (len < 2)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1499 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1500 get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1501 c = get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1502 len -= 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1503 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1504 if ((c & 0xf0) == 0x20) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1505 if (len < 4)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1506 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1507 dts = pts = get_pts(&s->pb, c);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1508 len -= 4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1509 } else if ((c & 0xf0) == 0x30) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1510 if (len < 9)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1511 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1512 pts = get_pts(&s->pb, c);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1513 dts = get_pts(&s->pb, -1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1514 len -= 9;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1515 } else if ((c & 0xc0) == 0x80) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1516 /* mpeg 2 PES */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1517 #if 0 /* some streams have this field set for no apparent reason */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1518 if ((c & 0x30) != 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1519 /* Encrypted multiplex not handled */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1520 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1521 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1522 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1523 flags = get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1524 header_len = get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1525 len -= 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1526 if (header_len > len)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1527 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1528 if ((flags & 0xc0) == 0x80) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1529 dts = pts = get_pts(&s->pb, -1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1530 if (header_len < 5)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1531 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1532 header_len -= 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1533 len -= 5;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1534 } if ((flags & 0xc0) == 0xc0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1535 pts = get_pts(&s->pb, -1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1536 dts = get_pts(&s->pb, -1);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1537 if (header_len < 10)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1538 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1539 header_len -= 10;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1540 len -= 10;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1541 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1542 len -= header_len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1543 while (header_len > 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1544 get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1545 header_len--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1546 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1547 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1548 else if( c!= 0xf )
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1549 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1550
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1551 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1552 if (len < 1)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1553 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1554 startcode = get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1555 len--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1556 if (startcode >= 0x80 && startcode <= 0xbf) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1557 /* audio: skip header */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1558 if (len < 3)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1559 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1560 get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1561 get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1562 get_byte(&s->pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1563 len -= 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1564 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1565 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1566 if(dts != AV_NOPTS_VALUE && ppos){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1567 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1568 for(i=0; i<s->nb_streams; i++){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1569 if(startcode == s->streams[i]->id) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1570 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1571 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1572 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1573 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1574
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1575 *pstart_code = startcode;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1576 *ppts = pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1577 *pdts = dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1578 return len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1579 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1580
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1581 static int mpegps_read_packet(AVFormatContext *s,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1582 AVPacket *pkt)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1583 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1584 MpegDemuxContext *m = s->priv_data;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1585 AVStream *st;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1586 int len, startcode, i, type, codec_id = 0, es_type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1587 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1588
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1589 redo:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1590 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1591 if (len < 0)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1592 return len;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1593
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1594 /* now find stream */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1595 for(i=0;i<s->nb_streams;i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1596 st = s->streams[i];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1597 if (st->id == startcode)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1598 goto found;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1599 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1600
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1601 es_type = m->psm_es_type[startcode & 0xff];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1602 if(es_type > 0){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1603 if(es_type == STREAM_TYPE_VIDEO_MPEG1){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1604 codec_id = CODEC_ID_MPEG2VIDEO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1605 type = CODEC_TYPE_VIDEO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1606 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1607 codec_id = CODEC_ID_MPEG2VIDEO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1608 type = CODEC_TYPE_VIDEO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1609 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1610 es_type == STREAM_TYPE_AUDIO_MPEG2){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1611 codec_id = CODEC_ID_MP3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1612 type = CODEC_TYPE_AUDIO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1613 } else if(es_type == STREAM_TYPE_AUDIO_AAC){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1614 codec_id = CODEC_ID_AAC;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1615 type = CODEC_TYPE_AUDIO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1616 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1617 codec_id = CODEC_ID_MPEG4;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1618 type = CODEC_TYPE_VIDEO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1619 } else if(es_type == STREAM_TYPE_VIDEO_H264){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1620 codec_id = CODEC_ID_H264;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1621 type = CODEC_TYPE_VIDEO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1622 } else if(es_type == STREAM_TYPE_AUDIO_AC3){
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1623 codec_id = CODEC_ID_AC3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1624 type = CODEC_TYPE_AUDIO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1625 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1626 goto skip;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1627 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1628 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1629 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1630 unsigned char buf[8];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1631 get_buffer(&s->pb, buf, 8);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1632 url_fseek(&s->pb, -8, SEEK_CUR);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1633 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1634 codec_id = CODEC_ID_CAVS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1635 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1636 codec_id = CODEC_ID_MPEG2VIDEO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1637 type = CODEC_TYPE_VIDEO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1638 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1639 type = CODEC_TYPE_AUDIO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1640 codec_id = CODEC_ID_MP2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1641 } else if (startcode >= 0x80 && startcode <= 0x87) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1642 type = CODEC_TYPE_AUDIO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1643 codec_id = CODEC_ID_AC3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1644 } else if (startcode >= 0x88 && startcode <= 0x9f) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1645 type = CODEC_TYPE_AUDIO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1646 codec_id = CODEC_ID_DTS;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1647 } else if (startcode >= 0xa0 && startcode <= 0xbf) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1648 type = CODEC_TYPE_AUDIO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1649 codec_id = CODEC_ID_PCM_S16BE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1650 } else if (startcode >= 0x20 && startcode <= 0x3f) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1651 type = CODEC_TYPE_SUBTITLE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1652 codec_id = CODEC_ID_DVD_SUBTITLE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1653 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1654 skip:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1655 /* skip packet */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1656 url_fskip(&s->pb, len);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1657 goto redo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1658 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1659 /* no stream found: add a new stream */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1660 st = av_new_stream(s, startcode);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1661 if (!st)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1662 goto skip;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1663 st->codec->codec_type = type;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1664 st->codec->codec_id = codec_id;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1665 if (codec_id != CODEC_ID_PCM_S16BE)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1666 st->need_parsing = 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1667 found:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1668 if(st->discard >= AVDISCARD_ALL)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1669 goto skip;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1670 if (startcode >= 0xa0 && startcode <= 0xbf) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1671 int b1, freq;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1672
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1673 /* for LPCM, we just skip the header and consider it is raw
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1674 audio data */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1675 if (len <= 3)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1676 goto skip;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1677 get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1678 b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1679 get_byte(&s->pb); /* dynamic range control (0x80 = off) */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1680 len -= 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1681 freq = (b1 >> 4) & 3;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1682 st->codec->sample_rate = lpcm_freq_tab[freq];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1683 st->codec->channels = 1 + (b1 & 7);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1684 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1685 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1686 av_new_packet(pkt, len);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1687 get_buffer(&s->pb, pkt->data, pkt->size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1688 pkt->pts = pts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1689 pkt->dts = dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1690 pkt->stream_index = st->index;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1691 #if 0
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1692 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1693 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, pkt->size);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1694 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1695
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1696 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1697 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1698
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1699 static int mpegps_read_close(AVFormatContext *s)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1700 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1701 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1702 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1703
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1704 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1705 int64_t *ppos, int64_t pos_limit)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1706 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1707 int len, startcode;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1708 int64_t pos, pts, dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1709
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1710 pos = *ppos;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1711 #ifdef DEBUG_SEEK
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1712 printf("read_dts: pos=0x%llx next=%d -> ", pos, find_next);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1713 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1714 url_fseek(&s->pb, pos, SEEK_SET);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1715 for(;;) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1716 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1717 if (len < 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1718 #ifdef DEBUG_SEEK
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1719 printf("none (ret=%d)\n", len);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1720 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1721 return AV_NOPTS_VALUE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1722 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1723 if (startcode == s->streams[stream_index]->id &&
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1724 dts != AV_NOPTS_VALUE) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1725 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1726 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1727 url_fskip(&s->pb, len);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1728 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1729 #ifdef DEBUG_SEEK
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1730 printf("pos=0x%llx dts=0x%llx %0.3f\n", pos, dts, dts / 90000.0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1731 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1732 *ppos = pos;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1733 return dts;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1734 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1735
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1736 #ifdef CONFIG_MPEG1SYSTEM_MUXER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1737 AVOutputFormat mpeg1system_muxer = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1738 "mpeg",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1739 "MPEG1 System format",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1740 "video/mpeg",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1741 "mpg,mpeg",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1742 sizeof(MpegMuxContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1743 CODEC_ID_MP2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1744 CODEC_ID_MPEG1VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1745 mpeg_mux_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1746 mpeg_mux_write_packet,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1747 mpeg_mux_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1748 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1749 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1750 #ifdef CONFIG_MPEG1VCD_MUXER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1751 AVOutputFormat mpeg1vcd_muxer = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1752 "vcd",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1753 "MPEG1 System format (VCD)",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1754 "video/mpeg",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1755 NULL,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1756 sizeof(MpegMuxContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1757 CODEC_ID_MP2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1758 CODEC_ID_MPEG1VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1759 mpeg_mux_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1760 mpeg_mux_write_packet,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1761 mpeg_mux_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1762 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1763 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1764 #ifdef CONFIG_MPEG2VOB_MUXER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1765 AVOutputFormat mpeg2vob_muxer = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1766 "vob",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1767 "MPEG2 PS format (VOB)",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1768 "video/mpeg",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1769 "vob",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1770 sizeof(MpegMuxContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1771 CODEC_ID_MP2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1772 CODEC_ID_MPEG2VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1773 mpeg_mux_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1774 mpeg_mux_write_packet,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1775 mpeg_mux_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1776 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1777 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1778
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1779 /* Same as mpeg2vob_mux except that the pack size is 2324 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1780 #ifdef CONFIG_MPEG2SVCD_MUXER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1781 AVOutputFormat mpeg2svcd_muxer = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1782 "svcd",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1783 "MPEG2 PS format (VOB)",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1784 "video/mpeg",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1785 "vob",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1786 sizeof(MpegMuxContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1787 CODEC_ID_MP2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1788 CODEC_ID_MPEG2VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1789 mpeg_mux_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1790 mpeg_mux_write_packet,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1791 mpeg_mux_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1792 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1793 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1794
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1795 /* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1796 #ifdef CONFIG_MPEG2DVD_MUXER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1797 AVOutputFormat mpeg2dvd_muxer = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1798 "dvd",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1799 "MPEG2 PS format (DVD VOB)",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1800 "video/mpeg",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1801 "dvd",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1802 sizeof(MpegMuxContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1803 CODEC_ID_MP2,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1804 CODEC_ID_MPEG2VIDEO,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1805 mpeg_mux_init,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1806 mpeg_mux_write_packet,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1807 mpeg_mux_end,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1808 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1809 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1810
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1811 #ifdef CONFIG_MPEGPS_DEMUXER
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1812 AVInputFormat mpegps_demuxer = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1813 "mpeg",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1814 "MPEG PS format",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1815 sizeof(MpegDemuxContext),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1816 mpegps_probe,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1817 mpegps_read_header,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1818 mpegps_read_packet,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1819 mpegps_read_close,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1820 NULL, //mpegps_read_seek,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1821 mpegps_read_dts,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1822 .flags = AVFMT_SHOW_IDS,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1823 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1824 #endif