annotate rm.c @ 879:1f093ae472d8 libavformat

Cook compatibe decoder, patch by Benjamin Larsson Add cook demucing, change rm demuxer so that it reorders audio packets before sending them to the decoder, and send minimum decodeable sized packets; pass only real codec extradata fo the decoder Fix 28_8 decoder for the new demuxer strategy
author rtognimp
date Fri, 09 Dec 2005 16:08:18 +0000
parents 66cc656ea404
children 2ece9c9dd94c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * "Real" compatible mux and demux.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 /* in ms */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 #define BUFFER_DURATION 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 int nb_packets;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 int packet_total_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 int packet_max_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 /* codec related output */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 int bit_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 float frame_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31 int nb_frames; /* current frame number */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 int total_frames; /* total number of frames */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 int num;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 AVCodecContext *enc;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 } StreamInfo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 StreamInfo streams[2];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 StreamInfo *audio_stream, *video_stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 int data_pos; /* position of the data after the header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 int nb_packets;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
42 int old_format;
609
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
43 int current_stream;
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
44 int remaining_len;
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
45 /// Audio descrambling matrix parameters
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
46 uint8_t *audiobuf; ///< place to store reordered audio data
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
47 int64_t audiotimestamp; ///< Audio packet timestamp
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
48 int sub_packet_cnt; // Subpacket counter, used while reading
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
49 int sub_packet_size, sub_packet_h, coded_framesize; ///< Descrambling parameters from container
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
50 int audio_stream_num; ///< Stream number for audio packets
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
51 int audio_pkt_cnt; ///< Output packet counter
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
52 int audio_framesize; /// Audio frame size from container
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 } RMContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 820
diff changeset
55 #ifdef CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56 static void put_str(ByteIOContext *s, const char *tag)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 put_be16(s,strlen(tag));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59 while (*tag) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 put_byte(s, *tag++);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 static void put_str8(ByteIOContext *s, const char *tag)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66 put_byte(s, strlen(tag));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 while (*tag) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 put_byte(s, *tag++);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 static void rv10_write_header(AVFormatContext *ctx,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 int data_size, int index_pos)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 RMContext *rm = ctx->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 ByteIOContext *s = &ctx->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 StreamInfo *stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 unsigned char *data_offset_ptr, *start_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 const char *desc, *mimetype;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 int nb_packets, packet_total_size, packet_max_size, size, packet_avg_size, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 int bit_rate, v, duration, flags, data_pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 start_ptr = s->buf_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 put_tag(s, ".RMF");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 put_be32(s,18); /* header size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87 put_be16(s,0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 put_be32(s,0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 put_be32(s,4 + ctx->nb_streams); /* num headers */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 put_tag(s,"PROP");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 put_be32(s, 50);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 put_be16(s, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 packet_max_size = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 packet_total_size = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 nb_packets = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 bit_rate = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 duration = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 for(i=0;i<ctx->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 StreamInfo *stream = &rm->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 bit_rate += stream->bit_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 if (stream->packet_max_size > packet_max_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 packet_max_size = stream->packet_max_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 nb_packets += stream->nb_packets;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 packet_total_size += stream->packet_total_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 /* select maximum duration */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 v = (int) (1000.0 * (float)stream->total_frames / stream->frame_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 if (v > duration)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 duration = v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 put_be32(s, bit_rate); /* max bit rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 put_be32(s, bit_rate); /* avg bit rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 put_be32(s, packet_max_size); /* max packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 if (nb_packets > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 packet_avg_size = packet_total_size / nb_packets;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 packet_avg_size = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 put_be32(s, packet_avg_size); /* avg packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119 put_be32(s, nb_packets); /* num packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 put_be32(s, duration); /* duration */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 put_be32(s, BUFFER_DURATION); /* preroll */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 put_be32(s, index_pos); /* index offset */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 /* computation of data the data offset */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 data_offset_ptr = s->buf_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 put_be32(s, 0); /* data offset : will be patched after */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 put_be16(s, ctx->nb_streams); /* num streams */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 flags = 1 | 2; /* save allowed & perfect play */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 if (url_is_streamed(s))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 flags |= 4; /* live broadcast */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 put_be16(s, flags);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 /* comments */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 put_tag(s,"CONT");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 size = strlen(ctx->title) + strlen(ctx->author) + strlen(ctx->copyright) +
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 strlen(ctx->comment) + 4 * 2 + 10;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 put_be32(s,size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 put_be16(s,0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 put_str(s, ctx->title);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 put_str(s, ctx->author);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 put_str(s, ctx->copyright);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 put_str(s, ctx->comment);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 for(i=0;i<ctx->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 int codec_data_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 stream = &rm->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 if (stream->enc->codec_type == CODEC_TYPE_AUDIO) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 desc = "The Audio Stream";
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 mimetype = "audio/x-pn-realaudio";
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 codec_data_size = 73;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 desc = "The Video Stream";
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 mimetype = "video/x-pn-realvideo";
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 codec_data_size = 34;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 put_tag(s,"MDPR");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 size = 10 + 9 * 4 + strlen(desc) + strlen(mimetype) + codec_data_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 put_be32(s, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 put_be16(s, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 put_be16(s, i); /* stream number */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165 put_be32(s, stream->bit_rate); /* max bit rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
166 put_be32(s, stream->bit_rate); /* avg bit rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167 put_be32(s, stream->packet_max_size); /* max packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 if (stream->nb_packets > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
169 packet_avg_size = stream->packet_total_size /
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
170 stream->nb_packets;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
171 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 packet_avg_size = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 put_be32(s, packet_avg_size); /* avg packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174 put_be32(s, 0); /* start time */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
175 put_be32(s, BUFFER_DURATION); /* preroll */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 /* duration */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 if (url_is_streamed(s) || !stream->total_frames)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178 put_be32(s, (int)(3600 * 1000));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 put_be32(s, (int)(stream->total_frames * 1000 / stream->frame_rate));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181 put_str8(s, desc);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 put_str8(s, mimetype);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 put_be32(s, codec_data_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 if (stream->enc->codec_type == CODEC_TYPE_AUDIO) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
186 int coded_frame_size, fscode, sample_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 sample_rate = stream->enc->sample_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
188 coded_frame_size = (stream->enc->bit_rate *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 stream->enc->frame_size) / (8 * sample_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 /* audio codec info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 put_tag(s, ".ra");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192 put_byte(s, 0xfd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 put_be32(s, 0x00040000); /* version */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 put_tag(s, ".ra4");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 put_be32(s, 0x01b53530); /* stream length */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 put_be16(s, 4); /* unknown */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 put_be32(s, 0x39); /* header size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 switch(sample_rate) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 case 48000:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201 case 24000:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202 case 12000:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 fscode = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 case 44100:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207 case 22050:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 case 11025:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 fscode = 2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 case 32000:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 case 16000:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 case 8000:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 fscode = 3;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 put_be16(s, fscode); /* codec additional info, for AC3, seems
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 to be a frequency code */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 /* special hack to compensate rounding errors... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219 if (coded_frame_size == 557)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
220 coded_frame_size--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 put_be32(s, coded_frame_size); /* frame length */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222 put_be32(s, 0x51540); /* unknown */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
223 put_be32(s, 0x249f0); /* unknown */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 put_be32(s, 0x249f0); /* unknown */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225 put_be16(s, 0x01);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226 /* frame length : seems to be very important */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 put_be16(s, coded_frame_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228 put_be32(s, 0); /* unknown */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229 put_be16(s, stream->enc->sample_rate); /* sample rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 put_be32(s, 0x10); /* unknown */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 put_be16(s, stream->enc->channels);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 put_str8(s, "Int0"); /* codec name */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233 put_str8(s, "dnet"); /* codec name */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 put_be16(s, 0); /* title length */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 put_be16(s, 0); /* author length */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 put_be16(s, 0); /* copyright length */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 put_byte(s, 0); /* end of header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
238 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239 /* video codec info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 put_be32(s,34); /* size */
614
cbcb3ae970c8 rv20 encoding
michael
parents: 613
diff changeset
241 if(stream->enc->codec_id == CODEC_ID_RV10)
cbcb3ae970c8 rv20 encoding
michael
parents: 613
diff changeset
242 put_tag(s,"VIDORV10");
cbcb3ae970c8 rv20 encoding
michael
parents: 613
diff changeset
243 else
cbcb3ae970c8 rv20 encoding
michael
parents: 613
diff changeset
244 put_tag(s,"VIDORV20");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 put_be16(s, stream->enc->width);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 put_be16(s, stream->enc->height);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 put_be16(s, (int) stream->frame_rate); /* frames per seconds ? */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 put_be32(s,0); /* unknown meaning */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 put_be16(s, (int) stream->frame_rate); /* unknown meaning */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 put_be32(s,0); /* unknown meaning */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 put_be16(s, 8); /* unknown meaning */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 /* Seems to be the codec version: only use basic H263. The next
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 versions seems to add a diffential DC coding as in
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 MPEG... nothing new under the sun */
614
cbcb3ae970c8 rv20 encoding
michael
parents: 613
diff changeset
255 if(stream->enc->codec_id == CODEC_ID_RV10)
cbcb3ae970c8 rv20 encoding
michael
parents: 613
diff changeset
256 put_be32(s,0x10000000);
cbcb3ae970c8 rv20 encoding
michael
parents: 613
diff changeset
257 else
cbcb3ae970c8 rv20 encoding
michael
parents: 613
diff changeset
258 put_be32(s,0x20103001);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 //put_be32(s,0x10003000);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 /* patch data offset field */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 data_pos = s->buf_ptr - start_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 rm->data_pos = data_pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 data_offset_ptr[0] = data_pos >> 24;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 data_offset_ptr[1] = data_pos >> 16;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268 data_offset_ptr[2] = data_pos >> 8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 data_offset_ptr[3] = data_pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
270
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271 /* data stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
272 put_tag(s,"DATA");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
273 put_be32(s,data_size + 10 + 8);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
274 put_be16(s,0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
275
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276 put_be32(s, nb_packets); /* number of packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277 put_be32(s,0); /* next data header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280 static void write_packet_header(AVFormatContext *ctx, StreamInfo *stream,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 int length, int key_frame)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 int timestamp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 ByteIOContext *s = &ctx->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 stream->nb_packets++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 stream->packet_total_size += length;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288 if (length > stream->packet_max_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 stream->packet_max_size = length;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 put_be16(s,0); /* version */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292 put_be16(s,length + 12);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 put_be16(s, stream->num); /* stream number */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 timestamp = (1000 * (float)stream->nb_frames) / stream->frame_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 put_be32(s, timestamp); /* timestamp */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 put_byte(s, 0); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 put_byte(s, key_frame ? 2 : 0); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 static int rm_write_header(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
302 RMContext *rm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 StreamInfo *stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304 int n;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 AVCodecContext *codec;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307 for(n=0;n<s->nb_streams;n++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 s->streams[n]->id = n;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
309 codec = s->streams[n]->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 stream = &rm->streams[n];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311 memset(stream, 0, sizeof(StreamInfo));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 stream->num = n;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 stream->bit_rate = codec->bit_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 stream->enc = codec;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
316 switch(codec->codec_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 case CODEC_TYPE_AUDIO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
318 rm->audio_stream = stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319 stream->frame_rate = (float)codec->sample_rate / (float)codec->frame_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320 /* XXX: dummy values */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321 stream->packet_max_size = 1024;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 stream->nb_packets = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
323 stream->total_frames = stream->nb_packets;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
324 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325 case CODEC_TYPE_VIDEO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 rm->video_stream = stream;
743
af4e24d6310c switch to native time bases
michael
parents: 736
diff changeset
327 stream->frame_rate = (float)codec->time_base.den / (float)codec->time_base.num;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 /* XXX: dummy values */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 stream->packet_max_size = 4096;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 stream->nb_packets = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331 stream->total_frames = stream->nb_packets;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 default:
537
558a093b04db do not call (av_)abort()
michael
parents: 509
diff changeset
334 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338 rv10_write_header(s, 0, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
339 put_flush_packet(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342
470
334e08488ad1 correctly interleave packets during encoding
michael
parents: 468
diff changeset
343 static int rm_write_audio(AVFormatContext *s, const uint8_t *buf, int size, int flags)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 33
diff changeset
345 uint8_t *buf1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 RMContext *rm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348 StreamInfo *stream = rm->audio_stream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
351 /* XXX: suppress this malloc */
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 33
diff changeset
352 buf1= (uint8_t*) av_malloc( size * sizeof(uint8_t) );
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353
470
334e08488ad1 correctly interleave packets during encoding
michael
parents: 468
diff changeset
354 write_packet_header(s, stream, size, !!(flags & PKT_FLAG_KEY));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
355
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
356 /* for AC3, the words seems to be reversed */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
357 for(i=0;i<size;i+=2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
358 buf1[i] = buf[i+1];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
359 buf1[i+1] = buf[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
360 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 put_buffer(pb, buf1, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
363 stream->nb_frames++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
364 av_free(buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
365 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
366 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
367
470
334e08488ad1 correctly interleave packets during encoding
michael
parents: 468
diff changeset
368 static int rm_write_video(AVFormatContext *s, const uint8_t *buf, int size, int flags)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
369 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 RMContext *rm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
371 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
372 StreamInfo *stream = rm->video_stream;
470
334e08488ad1 correctly interleave packets during encoding
michael
parents: 468
diff changeset
373 int key_frame = !!(flags & PKT_FLAG_KEY);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
374
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375 /* XXX: this is incorrect: should be a parameter */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
377 /* Well, I spent some time finding the meaning of these bits. I am
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378 not sure I understood everything, but it works !! */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 #if 1
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 write_packet_header(s, stream, size + 7, key_frame);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 /* bit 7: '1' if final packet of a frame converted in several packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382 put_byte(pb, 0x81);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 /* bit 7: '1' if I frame. bits 6..0 : sequence number in current
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 frame starting from 1 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385 if (key_frame) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386 put_byte(pb, 0x81);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
388 put_byte(pb, 0x01);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389 }
611
8fcecf36e64c rm encoding fix
michael
parents: 610
diff changeset
390 put_be16(pb, 0x4000 + (size)); /* total frame size */
8fcecf36e64c rm encoding fix
michael
parents: 610
diff changeset
391 put_be16(pb, 0x4000 + (size)); /* offset from the start or the end */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
392 #else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 /* full frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394 write_packet_header(s, size + 6);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 put_byte(pb, 0xc0);
611
8fcecf36e64c rm encoding fix
michael
parents: 610
diff changeset
396 put_be16(pb, 0x4000 + size); /* total frame size */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397 put_be16(pb, 0x4000 + packet_number * 126); /* position in stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 put_byte(pb, stream->nb_frames & 0xff);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401 put_buffer(pb, buf, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
402 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
403
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 stream->nb_frames++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
405 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
406 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
407
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 370
diff changeset
408 static int rm_write_packet(AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
409 {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
410 if (s->streams[pkt->stream_index]->codec->codec_type ==
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
411 CODEC_TYPE_AUDIO)
470
334e08488ad1 correctly interleave packets during encoding
michael
parents: 468
diff changeset
412 return rm_write_audio(s, pkt->data, pkt->size, pkt->flags);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
413 else
470
334e08488ad1 correctly interleave packets during encoding
michael
parents: 468
diff changeset
414 return rm_write_video(s, pkt->data, pkt->size, pkt->flags);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417 static int rm_write_trailer(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
419 RMContext *rm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420 int data_size, index_pos, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
421 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 if (!url_is_streamed(&s->pb)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
424 /* end of file: finish to write header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
425 index_pos = url_fseek(pb, 0, SEEK_CUR);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
426 data_size = index_pos - rm->data_pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
428 /* index */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
429 put_tag(pb, "INDX");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
430 put_be32(pb, 10 + 10 * s->nb_streams);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431 put_be16(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434 put_be32(pb, 0); /* zero indices */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
435 put_be16(pb, i); /* stream number */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
436 put_be32(pb, 0); /* next index */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
437 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
438 /* undocumented end header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
439 put_be32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
440 put_be32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
441
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
442 url_fseek(pb, 0, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
443 for(i=0;i<s->nb_streams;i++)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
444 rm->streams[i].total_frames = rm->streams[i].nb_frames;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
445 rv10_write_header(s, data_size, index_pos);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
446 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447 /* undocumented end header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448 put_be32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449 put_be32(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
452 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453 }
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 820
diff changeset
454 #endif //CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 /***************************************************/
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 static void get_str(ByteIOContext *pb, char *buf, int buf_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
459 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
460 int len, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 char *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463 len = get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465 for(i=0;i<len;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 if (i < buf_size - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467 *q++ = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
469 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
470 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
471
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
472 static void get_str8(ByteIOContext *pb, char *buf, int buf_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474 int len, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
475 char *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
476
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
477 len = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
478 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
479 for(i=0;i<len;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
480 if (i < buf_size - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
481 *q++ = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
482 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
483 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
484 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
485
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
486 static void rm_read_audio_stream_info(AVFormatContext *s, AVStream *st,
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
487 int read_all)
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
488 {
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
489 RMContext *rm = s->priv_data;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
490 ByteIOContext *pb = &s->pb;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
491 char buf[128];
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
492 uint32_t version;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
493 int i;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
494
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
495 /* ra type header */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
496 version = get_be32(pb); /* version */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
497 if (((version >> 16) & 0xff) == 3) {
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
498 /* very old version */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
499 for(i = 0; i < 14; i++)
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
500 get_byte(pb);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
501 get_str8(pb, s->title, sizeof(s->title));
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
502 get_str8(pb, s->author, sizeof(s->author));
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
503 get_str8(pb, s->copyright, sizeof(s->copyright));
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
504 get_str8(pb, s->comment, sizeof(s->comment));
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
505 get_byte(pb);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
506 get_str8(pb, buf, sizeof(buf));
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
507 st->codec->sample_rate = 8000;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
508 st->codec->channels = 1;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
509 st->codec->codec_type = CODEC_TYPE_AUDIO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
510 st->codec->codec_id = CODEC_ID_RA_144;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
511 } else {
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
512 int flavor, sub_packet_h, coded_framesize, sub_packet_size;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
513 /* old version (4) */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
514 get_be32(pb); /* .ra4 */
687
561f27e36bc4 ra288 demuxing support (doesnt really work, might be demuxer or decoder bug)
michael
parents: 652
diff changeset
515 get_be32(pb); /* data size */
561f27e36bc4 ra288 demuxing support (doesnt really work, might be demuxer or decoder bug)
michael
parents: 652
diff changeset
516 get_be16(pb); /* version2 */
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
517 get_be32(pb); /* header size */
687
561f27e36bc4 ra288 demuxing support (doesnt really work, might be demuxer or decoder bug)
michael
parents: 652
diff changeset
518 flavor= get_be16(pb); /* add codec info / flavor */
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
519 rm->coded_framesize = coded_framesize = get_be32(pb); /* coded frame size */
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
520 get_be32(pb); /* ??? */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
521 get_be32(pb); /* ??? */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
522 get_be32(pb); /* ??? */
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
523 rm->sub_packet_h = sub_packet_h = get_be16(pb); /* 1 */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
524 st->codec->block_align= get_be16(pb); /* frame size */
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
525 rm->sub_packet_size = sub_packet_size = get_be16(pb); /* sub packet size */
687
561f27e36bc4 ra288 demuxing support (doesnt really work, might be demuxer or decoder bug)
michael
parents: 652
diff changeset
526 get_be16(pb); /* ??? */
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
527 if (((version >> 16) & 0xff) == 5) {
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
528 get_be16(pb); get_be16(pb); get_be16(pb); }
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
529 st->codec->sample_rate = get_be16(pb);
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
530 get_be32(pb);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
531 st->codec->channels = get_be16(pb);
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
532 if (((version >> 16) & 0xff) == 5) {
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
533 get_be32(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
534 buf[0] = get_byte(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
535 buf[1] = get_byte(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
536 buf[2] = get_byte(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
537 buf[3] = get_byte(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
538 buf[4] = 0;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
539 } else {
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
540 get_str8(pb, buf, sizeof(buf)); /* desc */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
541 get_str8(pb, buf, sizeof(buf)); /* desc */
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
542 }
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
543 st->codec->codec_type = CODEC_TYPE_AUDIO;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
544 if (!strcmp(buf, "dnet")) {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
545 st->codec->codec_id = CODEC_ID_AC3;
687
561f27e36bc4 ra288 demuxing support (doesnt really work, might be demuxer or decoder bug)
michael
parents: 652
diff changeset
546 } else if (!strcmp(buf, "28_8")) {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
547 st->codec->codec_id = CODEC_ID_RA_288;
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
548 st->codec->extradata_size= 0;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
549 rm->audio_framesize = st->codec->block_align;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
550 st->codec->block_align = coded_framesize;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
551 rm->audiobuf = av_malloc(rm->audio_framesize * sub_packet_h);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
552 } else if (!strcmp(buf, "cook")) {
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
553 int codecdata_length, i;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
554 get_be16(pb); get_byte(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
555 if (((version >> 16) & 0xff) == 5)
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
556 get_byte(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
557 codecdata_length = get_be32(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
558 st->codec->codec_id = CODEC_ID_COOK;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
559 st->codec->extradata_size= codecdata_length;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
560 st->codec->extradata= av_mallocz(st->codec->extradata_size);
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
561 for(i = 0; i < codecdata_length; i++)
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
562 ((uint8_t*)st->codec->extradata)[i] = get_byte(pb);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
563 rm->audio_framesize = st->codec->block_align;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
564 st->codec->block_align = rm->sub_packet_size;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
565 rm->audiobuf = av_malloc(rm->audio_framesize * sub_packet_h);
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
566 } else {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
567 st->codec->codec_id = CODEC_ID_NONE;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
568 pstrcpy(st->codec->codec_name, sizeof(st->codec->codec_name),
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
569 buf);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
570 }
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
571 if (read_all) {
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
572 get_byte(pb);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
573 get_byte(pb);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
574 get_byte(pb);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
575
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
576 get_str8(pb, s->title, sizeof(s->title));
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
577 get_str8(pb, s->author, sizeof(s->author));
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
578 get_str8(pb, s->copyright, sizeof(s->copyright));
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
579 get_str8(pb, s->comment, sizeof(s->comment));
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
580 }
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
581 }
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
582 }
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
583
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
584 static int rm_read_header_old(AVFormatContext *s, AVFormatParameters *ap)
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
585 {
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
586 RMContext *rm = s->priv_data;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
587 AVStream *st;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
588
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
589 rm->old_format = 1;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
590 st = av_new_stream(s, 0);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
591 if (!st)
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
592 goto fail;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
593 rm_read_audio_stream_info(s, st, 1);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
594 return 0;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
595 fail:
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
596 return -1;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
597 }
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
598
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
599 static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
600 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
601 RMContext *rm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
602 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
603 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
604 unsigned int tag, v;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 int tag_size, size, codec_data_size, i;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 33
diff changeset
606 int64_t codec_pos;
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 85
diff changeset
607 unsigned int h263_hack_version, start_time, duration;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
608 char buf[128];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
609 int flags = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
610
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
611 tag = get_le32(pb);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
612 if (tag == MKTAG('.', 'r', 'a', 0xfd)) {
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
613 /* very old .ra format */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
614 return rm_read_header_old(s, ap);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
615 } else if (tag != MKTAG('.', 'R', 'M', 'F')) {
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 470
diff changeset
616 return AVERROR_IO;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
617 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
618
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
619 get_be32(pb); /* header size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
620 get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
621 get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
622 get_be32(pb); /* number of headers */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
623
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
624 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
625 if (url_feof(pb))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
626 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
627 tag = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
628 tag_size = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
629 get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
630 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
631 printf("tag=%c%c%c%c (%08x) size=%d\n",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
632 (tag) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
633 (tag >> 8) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
634 (tag >> 16) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
635 (tag >> 24) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
636 tag,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
637 tag_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
638 #endif
736
82c34355e466 fixing broken_rv20_1mb_.rm
michael
parents: 708
diff changeset
639 if (tag_size < 10 && tag != MKTAG('D', 'A', 'T', 'A'))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
640 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
641 switch(tag) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
642 case MKTAG('P', 'R', 'O', 'P'):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
643 /* file header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
644 get_be32(pb); /* max bit rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
645 get_be32(pb); /* avg bit rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
646 get_be32(pb); /* max packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
647 get_be32(pb); /* avg packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
648 get_be32(pb); /* nb packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
649 get_be32(pb); /* duration */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
650 get_be32(pb); /* preroll */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
651 get_be32(pb); /* index offset */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
652 get_be32(pb); /* data offset */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
653 get_be16(pb); /* nb streams */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
654 flags = get_be16(pb); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
655 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
656 case MKTAG('C', 'O', 'N', 'T'):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
657 get_str(pb, s->title, sizeof(s->title));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
658 get_str(pb, s->author, sizeof(s->author));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
659 get_str(pb, s->copyright, sizeof(s->copyright));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
660 get_str(pb, s->comment, sizeof(s->comment));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
661 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
662 case MKTAG('M', 'D', 'P', 'R'):
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 85
diff changeset
663 st = av_new_stream(s, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
664 if (!st)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
665 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
666 st->id = get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
667 get_be32(pb); /* max bit rate */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
668 st->codec->bit_rate = get_be32(pb); /* bit rate */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
669 get_be32(pb); /* max packet size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
670 get_be32(pb); /* avg packet size */
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 85
diff changeset
671 start_time = get_be32(pb); /* start time */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
672 get_be32(pb); /* preroll */
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 85
diff changeset
673 duration = get_be32(pb); /* duration */
743
af4e24d6310c switch to native time bases
michael
parents: 736
diff changeset
674 st->start_time = start_time;
af4e24d6310c switch to native time bases
michael
parents: 736
diff changeset
675 st->duration = duration;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
676 get_str8(pb, buf, sizeof(buf)); /* desc */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
677 get_str8(pb, buf, sizeof(buf)); /* mimetype */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
678 codec_data_size = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
679 codec_pos = url_ftell(pb);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
680 st->codec->codec_type = CODEC_TYPE_DATA;
607
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
681 av_set_pts_info(st, 64, 1, 1000);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
682
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
683 v = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
684 if (v == MKTAG(0xfd, 'a', 'r', '.')) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
685 /* ra type header */
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
686 rm_read_audio_stream_info(s, st, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
687 } else {
604
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
688 int fps, fps2;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
689 if (get_le32(pb) != MKTAG('V', 'I', 'D', 'O')) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
690 fail1:
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
691 av_log(st->codec, AV_LOG_ERROR, "Unsupported video codec\n");
593
a1f354e84965 skip unknown streams instead of failing
michael
parents: 592
diff changeset
692 goto skip;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
693 }
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
694 st->codec->codec_tag = get_le32(pb);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
695 // av_log(NULL, AV_LOG_DEBUG, "%X %X\n", st->codec->codec_tag, MKTAG('R', 'V', '2', '0'));
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
696 if ( st->codec->codec_tag != MKTAG('R', 'V', '1', '0')
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
697 && st->codec->codec_tag != MKTAG('R', 'V', '2', '0')
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
698 && st->codec->codec_tag != MKTAG('R', 'V', '3', '0')
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
699 && st->codec->codec_tag != MKTAG('R', 'V', '4', '0'))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
700 goto fail1;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
701 st->codec->width = get_be16(pb);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
702 st->codec->height = get_be16(pb);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
703 st->codec->time_base.num= 1;
604
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
704 fps= get_be16(pb);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
705 st->codec->codec_type = CODEC_TYPE_VIDEO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
706 get_be32(pb);
604
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
707 fps2= get_be16(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
708 get_be16(pb);
604
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
709
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
710 st->codec->extradata_size= codec_data_size - (url_ftell(pb) - codec_pos);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
711 st->codec->extradata= av_malloc(st->codec->extradata_size);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
712 get_buffer(pb, st->codec->extradata, st->codec->extradata_size);
604
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
713
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
714 // av_log(NULL, AV_LOG_DEBUG, "fps= %d fps2= %d\n", fps, fps2);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
715 st->codec->time_base.den = fps * st->codec->time_base.num;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
716 /* modification of h263 codec version (!) */
604
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
717 #ifdef WORDS_BIGENDIAN
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
718 h263_hack_version = ((uint32_t*)st->codec->extradata)[1];
604
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
719 #else
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
720 h263_hack_version = bswap_32(((uint32_t*)st->codec->extradata)[1]);
604
ed2709c1f49c next try at fixing rv20 decoding
michael
parents: 593
diff changeset
721 #endif
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
722 st->codec->sub_id = h263_hack_version;
638
5188094c6ec4 RV30/RV40 demuxing (untested)
michael
parents: 632
diff changeset
723 switch((h263_hack_version>>28)){
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
724 case 1: st->codec->codec_id = CODEC_ID_RV10; break;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
725 case 2: st->codec->codec_id = CODEC_ID_RV20; break;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
726 case 3: st->codec->codec_id = CODEC_ID_RV30; break;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
727 case 4: st->codec->codec_id = CODEC_ID_RV40; break;
638
5188094c6ec4 RV30/RV40 demuxing (untested)
michael
parents: 632
diff changeset
728 default: goto fail1;
5188094c6ec4 RV30/RV40 demuxing (untested)
michael
parents: 632
diff changeset
729 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
730 }
593
a1f354e84965 skip unknown streams instead of failing
michael
parents: 592
diff changeset
731 skip:
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
732 /* skip codec info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
733 size = url_ftell(pb) - codec_pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
734 url_fskip(pb, codec_data_size - size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
735 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
736 case MKTAG('D', 'A', 'T', 'A'):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
737 goto header_end;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
738 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
739 /* unknown tag: skip it */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
740 url_fskip(pb, tag_size - 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
741 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
742 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
743 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
744 header_end:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
745 rm->nb_packets = get_be32(pb); /* number of packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
746 if (!rm->nb_packets && (flags & 4))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
747 rm->nb_packets = 3600 * 25;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
748 get_be32(pb); /* next data header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
749 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
750
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
751 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
752 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
753 av_free(s->streams[i]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
754 }
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 470
diff changeset
755 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
756 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
757
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
758 static int get_num(ByteIOContext *pb, int *len)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
759 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
760 int n, n1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
761
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
762 n = get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
763 (*len)-=2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
764 if (n >= 0x4000) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
765 return n - 0x4000;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
766 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
767 n1 = get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768 (*len)-=2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
769 return (n << 16) | n1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
770 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
773 /* multiple of 20 bytes for ra144 (ugly) */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
774 #define RAW_PACKET_SIZE 1000
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
775
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
776 static int sync(AVFormatContext *s, int64_t *timestamp, int *flags, int *stream_index, int64_t *pos){
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
777 RMContext *rm = s->priv_data;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
778 ByteIOContext *pb = &s->pb;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
779 int len, num, res, i;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
780 AVStream *st;
632
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
781 uint32_t state=0xFFFFFFFF;
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
782
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
783 while(!url_feof(pb)){
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
784 *pos= url_ftell(pb);
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
785 if(rm->remaining_len > 0){
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
786 num= rm->current_stream;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
787 len= rm->remaining_len;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
788 *timestamp = AV_NOPTS_VALUE;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
789 *flags= 0;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
790 }else{
632
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
791 state= (state<<8) + get_byte(pb);
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
792
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
793 if(state == MKBETAG('I', 'N', 'D', 'X')){
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
794 len = get_be16(pb) - 6;
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
795 if(len<0)
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
796 continue;
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
797 goto skip;
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
798 }
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
799
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
800 if(state > (unsigned)0xFFFF || state < 12)
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
801 continue;
632
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
802 len=state;
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
803 state= 0xFFFFFFFF;
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
804
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
805 num = get_be16(pb);
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
806 *timestamp = get_be32(pb);
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
807 res= get_byte(pb); /* reserved */
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
808 *flags = get_byte(pb); /* flags */
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
809
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
810
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
811 len -= 12;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
812 }
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
813 for(i=0;i<s->nb_streams;i++) {
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
814 st = s->streams[i];
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
815 if (num == st->id)
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
816 break;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
817 }
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
818 if (i == s->nb_streams) {
632
9f8fa2f4edfd skip INDX chunks
michael
parents: 614
diff changeset
819 skip:
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
820 /* skip packet if unknown number */
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
821 url_fskip(pb, len);
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
822 rm->remaining_len -= len;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
823 continue;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
824 }
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
825 *stream_index= i;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
826
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
827 return len;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
828 }
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
829 return -1;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
830 }
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
831
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
832 static int rm_read_packet(AVFormatContext *s, AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
833 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
834 RMContext *rm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
835 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
836 AVStream *st;
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
837 int i, len, tmp, j;
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
838 int64_t timestamp, pos;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 33
diff changeset
839 uint8_t *ptr;
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
840 int flags;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
841
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
842 if (rm->old_format) {
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
843 /* just read raw bytes */
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
844 len = RAW_PACKET_SIZE;
775
c5077fdab490 AVPacket.pos
michael
parents: 743
diff changeset
845 len= av_get_packet(pb, pkt, len);
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
846 pkt->stream_index = 0;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
847 if (len <= 0) {
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 470
diff changeset
848 return AVERROR_IO;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
849 }
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
850 pkt->size = len;
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
851 st = s->streams[0];
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
852 } else if (rm->audio_pkt_cnt) {
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
853 // If there are queued audio packet return them first
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
854 st = s->streams[rm->audio_stream_num];
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
855 av_new_packet(pkt, st->codec->block_align);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
856 memcpy(pkt->data, rm->audiobuf + st->codec->block_align *
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
857 (rm->sub_packet_h * rm->audio_framesize / st->codec->block_align - rm->audio_pkt_cnt),
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
858 st->codec->block_align);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
859 rm->audio_pkt_cnt--;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
860 pkt->flags = 0;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
861 pkt->stream_index = rm->audio_stream_num;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
862 } else {
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
863 int seq=1;
652
b47948262721 support discarding uninterresting packets
michael
parents: 638
diff changeset
864 resync:
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
865 len=sync(s, &timestamp, &flags, &i, &pos);
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
866 if(len<0)
610
1ab7b989f475 try to recover from errors instead of failing fataly
michael
parents: 609
diff changeset
867 return AVERROR_IO;
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
868 st = s->streams[i];
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
869
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
870 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
609
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
871 int h, pic_num, len2, pos;
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
872
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
873 h= get_byte(pb); len--;
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
874 if(!(h & 0x40)){
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
875 seq = get_byte(pb); len--;
609
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
876 }
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
877
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
878 if((h & 0xc0) == 0x40){
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
879 len2= pos= 0;
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
880 }else{
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
881 len2 = get_num(pb, &len);
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
882 pos = get_num(pb, &len);
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
883 }
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
884 /* picture number */
609
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
885 pic_num= get_byte(pb); len--;
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
886 rm->remaining_len= len;
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
887 rm->current_stream= st->id;
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
888
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
889 // av_log(NULL, AV_LOG_DEBUG, "%X len:%d pos:%d len2:%d pic_num:%d\n",h, len, pos, len2, pic_num);
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
890 if(len2 && len2<len)
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
891 len=len2;
2f0de265bc5e various demuxer fixes
michael
parents: 608
diff changeset
892 rm->remaining_len-= len;
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
893 av_get_packet(pb, pkt, len);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
894 }
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
895
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
896 if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
897 if ((st->codec->codec_id == CODEC_ID_RA_288) ||
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
898 (st->codec->codec_id == CODEC_ID_COOK)) {
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
899 int x;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
900 int sps = rm->sub_packet_size;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
901 int cfs = rm->coded_framesize;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
902 int h = rm->sub_packet_h;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
903 int y = rm->sub_packet_cnt;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
904 int w = rm->audio_framesize;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
905
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
906 if (flags & 2)
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
907 y = rm->sub_packet_cnt = 0;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
908 if (!y)
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
909 rm->audiotimestamp = timestamp;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
910
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
911 switch(st->codec->codec_id) {
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
912 case CODEC_ID_RA_288:
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
913 for (x = 0; x < h/2; x++)
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
914 get_buffer(pb, rm->audiobuf+x*2*w+y*cfs, cfs);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
915 break;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
916 case CODEC_ID_COOK:
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
917 for (x = 0; x < w/sps; x++)
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
918 get_buffer(pb, rm->audiobuf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), sps);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
919 break;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
920 }
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
921
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
922 if (++(rm->sub_packet_cnt) < h)
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
923 goto resync;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
924 else {
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
925 rm->sub_packet_cnt = 0;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
926 rm->audio_stream_num = i;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
927 rm->audio_pkt_cnt = h * w / st->codec->block_align - 1;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
928 // Release first audio packet
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
929 av_new_packet(pkt, st->codec->block_align);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
930 memcpy(pkt->data, rm->audiobuf, st->codec->block_align);
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
931 timestamp = rm->audiotimestamp;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
932 flags = 2; // Mark first packet as keyframe
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
933 }
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
934 } else
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
935 av_get_packet(pb, pkt, len);
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
936 }
652
b47948262721 support discarding uninterresting packets
michael
parents: 638
diff changeset
937
708
d79164865a7c more fine grained discarding of packets
michael
parents: 688
diff changeset
938 if( (st->discard >= AVDISCARD_NONKEY && !(flags&2))
d79164865a7c more fine grained discarding of packets
michael
parents: 688
diff changeset
939 || st->discard >= AVDISCARD_ALL){
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
940 av_free_packet(pkt);
652
b47948262721 support discarding uninterresting packets
michael
parents: 638
diff changeset
941 goto resync;
b47948262721 support discarding uninterresting packets
michael
parents: 638
diff changeset
942 }
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
943
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
944 pkt->stream_index = i;
607
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
945
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
946 #if 0
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
947 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
948 if(st->codec->codec_id == CODEC_ID_RV20){
607
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
949 int seq= 128*(pkt->data[2]&0x7F) + (pkt->data[3]>>1);
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
950 av_log(NULL, AV_LOG_DEBUG, "%d %Ld %d\n", timestamp, timestamp*512LL/25, seq);
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
951
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
952 seq |= (timestamp&~0x3FFF);
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
953 if(seq - timestamp > 0x2000) seq -= 0x4000;
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
954 if(seq - timestamp < -0x2000) seq += 0x4000;
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
955 }
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
956 }
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
957 #endif
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
958 pkt->pts= timestamp;
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
959 if(flags&2){
607
fce9fc3a0f17 timestamp fix
michael
parents: 604
diff changeset
960 pkt->flags |= PKT_FLAG_KEY;
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
961 if((seq&0x7F) == 1)
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
962 av_add_index_entry(st, pos, timestamp, 0, AVINDEX_KEYFRAME);
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
963 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
964 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
965
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
966 /* for AC3, needs to swap bytes */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
967 if (st->codec->codec_id == CODEC_ID_AC3) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
968 ptr = pkt->data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
969 for(j=0;j<len;j+=2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
970 tmp = ptr[0];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
971 ptr[0] = ptr[1];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
972 ptr[1] = tmp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
973 ptr += 2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
974 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
975 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
976 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
977 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
978
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
979 static int rm_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
980 {
879
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
981 RMContext *rm = s->priv_data;
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
982
1f093ae472d8 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents: 858
diff changeset
983 av_free(rm->audiobuf);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
984 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
985 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
986
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
987 static int rm_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
988 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
989 /* check file header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
990 if (p->buf_size <= 32)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
991 return 0;
194
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
992 if ((p->buf[0] == '.' && p->buf[1] == 'R' &&
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
993 p->buf[2] == 'M' && p->buf[3] == 'F' &&
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
994 p->buf[4] == 0 && p->buf[5] == 0) ||
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
995 (p->buf[0] == '.' && p->buf[1] == 'r' &&
37e7cd3d544d support for older real audio files (<= version 3)
bellard
parents: 188
diff changeset
996 p->buf[2] == 'a' && p->buf[3] == 0xfd))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
997 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
998 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
999 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1000 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1001
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1002 static int64_t rm_read_dts(AVFormatContext *s, int stream_index,
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1003 int64_t *ppos, int64_t pos_limit)
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1004 {
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1005 RMContext *rm = s->priv_data;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1006 int64_t pos, dts;
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1007 int stream_index2, flags, len, h;
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1008
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1009 pos = *ppos;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1010
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1011 if(rm->old_format)
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1012 return AV_NOPTS_VALUE;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1013
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1014 url_fseek(&s->pb, pos, SEEK_SET);
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1015 rm->remaining_len=0;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1016 for(;;){
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1017 int seq=1;
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1018 AVStream *st;
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1019
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1020 len=sync(s, &dts, &flags, &stream_index2, &pos);
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1021 if(len<0)
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1022 return AV_NOPTS_VALUE;
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1023
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1024 st = s->streams[stream_index2];
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
1025 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1026 h= get_byte(&s->pb); len--;
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1027 if(!(h & 0x40)){
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1028 seq = get_byte(&s->pb); len--;
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1029 }
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1030 }
613
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1031
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1032 if((flags&2) && (seq&0x7F) == 1){
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1033 // av_log(s, AV_LOG_DEBUG, "%d %d-%d %Ld %d\n", flags, stream_index2, stream_index, dts, seq);
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1034 av_add_index_entry(st, pos, dts, 0, AVINDEX_KEYFRAME);
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1035 if(stream_index2 == stream_index)
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1036 break;
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1037 }
2e70d3938f50 seeking in rm 2nd try
michael
parents: 612
diff changeset
1038
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1039 url_fskip(&s->pb, len);
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1040 }
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1041 *ppos = pos;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1042 return dts;
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1043 }
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1044
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1045 static AVInputFormat rm_iformat = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1046 "rm",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1047 "rm format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1048 sizeof(RMContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1049 rm_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1050 rm_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1051 rm_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1052 rm_read_close,
612
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1053 NULL,
fc167cb3b54c seeking in rm
michael
parents: 611
diff changeset
1054 rm_read_dts,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1055 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1056
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 820
diff changeset
1057 #ifdef CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1058 static AVOutputFormat rm_oformat = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1059 "rm",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1060 "rm format",
14
b167760cd0aa mimetype fixes patch by (Ryutaroh Matsumoto <ryutaroh at it dot ss dot titech dot ac dot jp>)
michaelni
parents: 7
diff changeset
1061 "application/vnd.rn-realmedia",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1062 "rm,ra",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1063 sizeof(RMContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1064 CODEC_ID_AC3,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1065 CODEC_ID_RV10,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1066 rm_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1067 rm_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1068 rm_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1069 };
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 820
diff changeset
1070 #endif //CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1071
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1072 int rm_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1073 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1074 av_register_input_format(&rm_iformat);
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 820
diff changeset
1075 #ifdef CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1076 av_register_output_format(&rm_oformat);
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 820
diff changeset
1077 #endif //CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1078 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1079 }