annotate ffm.c @ 1206:e60bf67d9bf8 libavformat

The reader ignores the size of the ASF data object and keeps on reading even beyond it. Therefore if the ASF file includes an index object at its end, the reader will treat the index like data, but of course will fail since it thinks that the data is corrupted. When reading an asf file with an index object, ffmpeg will complain at the end of the file that it read an invalid header. Patch by Kohn Emil Dan, < emild A cs P technion P ac P il > Original thead: Date: Apr 18, 2006 4:11 PM Subject: [Ffmpeg-devel] Two ASF related bugs and fixes
author gpoirier
date Sat, 29 Jul 2006 16:07:19 +0000
parents d18cc9a1fd02
children 0899bfe4105c
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 * FFM (ffserver live feed) encoder and decoder
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 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
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
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 #include <unistd.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 /* The FFM file is made of blocks of fixed size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #define FFM_HEADER_SIZE 14
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 #define PACKET_ID 0x666d
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 /* each packet contains frames (which can span several packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 #define FRAME_HEADER_SIZE 8
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 #define FLAG_KEY_FRAME 0x01
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 typedef struct FFMStream {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
31 int64_t pts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 } FFMStream;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 enum {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 READ_HEADER,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 READ_DATA,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 typedef struct FFMContext {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 /* only reading mode */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 offset_t write_index, file_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 int read_state;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
43 uint8_t header[FRAME_HEADER_SIZE];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 /* read and write */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 int first_packet; /* true if first packet, needed to set the discontinuity tag */
901
c1a07d63a66d pts fix by (Bryan Mayland / bmayland O leoninedev o com)
michael
parents: 896
diff changeset
47 int first_frame_in_packet; /* true if first frame in packet, needed to know if PTS information is valid */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 int packet_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 int frame_offset;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
50 int64_t pts;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
51 uint8_t *packet_ptr, *packet_end;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
52 uint8_t packet[FFM_PACKET_SIZE];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 } FFMContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54
318
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
55 static int64_t get_pts(AVFormatContext *s, offset_t pos);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
56
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 /* disable pts hack for testing */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 int ffm_nopts = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 823
diff changeset
60 #ifdef CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 static void flush_packet(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 int fill_size, h;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 fill_size = ffm->packet_end - ffm->packet_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 memset(ffm->packet_ptr, 0, fill_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 862
diff changeset
70 if (url_ftell(pb) % ffm->packet_size)
318
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
71 av_abort();
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
72
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 /* put header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 put_be16(pb, PACKET_ID);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 put_be16(pb, fill_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 put_be64(pb, ffm->pts);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 h = ffm->frame_offset;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 if (ffm->first_packet)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 h |= 0x8000;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 put_be16(pb, h);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 put_buffer(pb, ffm->packet, ffm->packet_end - ffm->packet);
751
dcb459ca11eb Flush the ffm packet to the wire (or file) whenever we flush the ffm packet.
philipjsg
parents: 744
diff changeset
82 put_flush_packet(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 /* prepare next packet */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 ffm->frame_offset = 0; /* no key frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 ffm->pts = 0; /* no pts */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87 ffm->packet_ptr = ffm->packet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 ffm->first_packet = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 /* 'first' is true if first data of a frame */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 static void ffm_write_data(AVFormatContext *s,
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 187
diff changeset
93 const uint8_t *buf, int size,
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
94 int64_t pts, int first)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 int len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 if (first && ffm->frame_offset == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 ffm->frame_offset = ffm->packet_ptr - ffm->packet + FFM_HEADER_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 if (first && ffm->pts == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 ffm->pts = pts;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 /* write as many packets as needed */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 while (size > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 len = ffm->packet_end - ffm->packet_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 if (len > size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 len = size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 memcpy(ffm->packet_ptr, buf, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 ffm->packet_ptr += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 buf += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 size -= len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 if (ffm->packet_ptr >= ffm->packet_end) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 /* special case : no pts in packet : we leave the current one */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 if (ffm->pts == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 ffm->pts = pts;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119 flush_packet(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 static int ffm_write_header(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 FFMStream *fst;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 AVCodecContext *codec;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 int bit_rate, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 ffm->packet_size = FFM_PACKET_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 /* header */
862
aa0abab5e320 fix feed read_header, avoid using put_tag in write_header, to be consistent with read_header, also some minor cosmetics
alex
parents: 858
diff changeset
136 put_le32(pb, MKTAG('F', 'F', 'M', '1'));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 put_be32(pb, ffm->packet_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 /* XXX: store write position in other file ? */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 put_be64(pb, ffm->packet_size); /* current write position */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 put_be32(pb, s->nb_streams);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 bit_rate = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 st = s->streams[i];
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
145 bit_rate += st->codec->bit_rate;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 put_be32(pb, bit_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 /* list of streams */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 fst = av_mallocz(sizeof(FFMStream));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 if (!fst)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 goto fail;
502
813b0119a98e ffserver fixes by (Koos Vriezen <koos.vriezen at xs4all dot nl>)
michael
parents: 468
diff changeset
155 av_set_pts_info(st, 64, 1, 1000000);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 st->priv_data = fst;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
158 codec = st->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 /* generic info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 put_be32(pb, codec->codec_id);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 put_byte(pb, codec->codec_type);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 put_be32(pb, codec->bit_rate);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
163 put_be32(pb, st->quality);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 put_be32(pb, codec->flags);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
165 put_be32(pb, codec->flags2);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
166 put_be32(pb, codec->debug);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167 /* specific info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 switch(codec->codec_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
169 case CODEC_TYPE_VIDEO:
743
af4e24d6310c switch to native time bases
michael
parents: 683
diff changeset
170 put_be32(pb, codec->time_base.num);
af4e24d6310c switch to native time bases
michael
parents: 683
diff changeset
171 put_be32(pb, codec->time_base.den);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 put_be16(pb, codec->width);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 put_be16(pb, codec->height);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174 put_be16(pb, codec->gop_size);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
175 put_be32(pb, codec->pix_fmt);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 put_byte(pb, codec->qmin);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 put_byte(pb, codec->qmax);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178 put_byte(pb, codec->max_qdiff);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 put_be16(pb, (int) (codec->qcompress * 10000.0));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 put_be16(pb, (int) (codec->qblur * 10000.0));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181 put_be32(pb, codec->bit_rate_tolerance);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 put_strz(pb, codec->rc_eq);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 put_be32(pb, codec->rc_max_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184 put_be32(pb, codec->rc_min_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 put_be32(pb, codec->rc_buffer_size);
823
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
186 put_be64(pb, av_dbl2int(codec->i_quant_factor));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
187 put_be64(pb, av_dbl2int(codec->b_quant_factor));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
188 put_be64(pb, av_dbl2int(codec->i_quant_offset));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
189 put_be64(pb, av_dbl2int(codec->b_quant_offset));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 put_be32(pb, codec->dct_algo);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
191 put_be32(pb, codec->strict_std_compliance);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
192 put_be32(pb, codec->max_b_frames);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
193 put_be32(pb, codec->luma_elim_threshold);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
194 put_be32(pb, codec->chroma_elim_threshold);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
195 put_be32(pb, codec->mpeg_quant);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
196 put_be32(pb, codec->intra_dc_precision);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
197 put_be32(pb, codec->me_method);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
198 put_be32(pb, codec->mb_decision);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
199 put_be32(pb, codec->nsse_weight);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
200 put_be32(pb, codec->frame_skip_cmp);
823
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
201 put_be64(pb, av_dbl2int(codec->rc_buffer_aggressivity));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 case CODEC_TYPE_AUDIO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 put_be32(pb, codec->sample_rate);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 put_le16(pb, codec->channels);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 put_le16(pb, codec->frame_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 default:
537
558a093b04db do not call (av_)abort()
michael
parents: 502
diff changeset
209 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 /* hack to have real time */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 if (ffm_nopts)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 fst->pts = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 fst->pts = av_gettime();
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 /* flush until end of block reached */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219 while ((url_ftell(pb) % ffm->packet_size) != 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
220 put_byte(pb, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
223
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 /* init packet mux */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225 ffm->packet_ptr = ffm->packet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226 ffm->packet_end = ffm->packet + ffm->packet_size - FFM_HEADER_SIZE;
537
558a093b04db do not call (av_)abort()
michael
parents: 502
diff changeset
227 assert(ffm->packet_end >= ffm->packet);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228 ffm->frame_offset = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229 ffm->pts = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 ffm->first_packet = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 av_freep(&st->priv_data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
238 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
241 static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242 {
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
243 AVStream *st = s->streams[pkt->stream_index];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 FFMStream *fst = st->priv_data;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
245 int64_t pts;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
246 uint8_t header[FRAME_HEADER_SIZE];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 int duration;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
248 int size= pkt->size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
250 //XXX/FIXME use duration from pkt
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
251 if (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
252 duration = ((float)st->codec->frame_size / st->codec->sample_rate * 1000000.0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 } 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
254 duration = (1000000.0 * st->codec->time_base.num / (float)st->codec->time_base.den);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 pts = fst->pts;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 /* packet size & key_frame */
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
259 header[0] = pkt->stream_index;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 header[1] = 0;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
261 if (pkt->flags & PKT_FLAG_KEY)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 header[1] |= FLAG_KEY_FRAME;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 header[2] = (size >> 16) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 header[3] = (size >> 8) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 header[4] = size & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 header[5] = (duration >> 16) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 header[6] = (duration >> 8) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268 header[7] = duration & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 ffm_write_data(s, header, FRAME_HEADER_SIZE, pts, 1);
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
270 ffm_write_data(s, pkt->data, size, pts, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
272 fst->pts += duration;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
273 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
274 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
275
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276 static int ffm_write_trailer(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 /* flush packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 if (ffm->packet_ptr > ffm->packet)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 flush_packet(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 if (!url_is_streamed(pb)) {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
288 int64_t size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 /* update the write offset */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290 size = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 url_fseek(pb, 8, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292 put_be64(pb, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 put_flush_packet(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 }
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 823
diff changeset
298 #endif //CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 /* ffm demux */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
302 static int ffm_is_avail_data(AVFormatContext *s, int size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 offset_t pos, avail_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306 int len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 len = ffm->packet_end - ffm->packet_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 if (!ffm_nopts) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 /* XXX: I don't understand this test, so I disabled it for testing */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311 if (size <= len)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 return 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 pos = url_ftell(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 if (pos == ffm->write_index) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
316 /* exactly at the end of stream */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
318 } else if (pos < ffm->write_index) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319 avail_size = ffm->write_index - pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321 avail_size = (ffm->file_size - pos) + (ffm->write_index - FFM_PACKET_SIZE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
323 avail_size = (avail_size / ffm->packet_size) * (ffm->packet_size - FFM_HEADER_SIZE) + len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
324 if (size <= avail_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325 return 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
327 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 /* first is true if we read the frame header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331 static int ffm_read_data(AVFormatContext *s,
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
332 uint8_t *buf, int size, int first)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 int len, fill_size, size1, frame_offset;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338 size1 = size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
339 while (size > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340 redo:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341 len = ffm->packet_end - ffm->packet_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342 if (len > size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
343 len = size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 if (len == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
345 if (url_ftell(pb) == ffm->file_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 url_fseek(pb, ffm->packet_size, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 retry_read:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348 get_be16(pb); /* PACKET_ID */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 fill_size = get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350 ffm->pts = get_be64(pb);
901
c1a07d63a66d pts fix by (Bryan Mayland / bmayland O leoninedev o com)
michael
parents: 896
diff changeset
351 ffm->first_frame_in_packet = 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
352 frame_offset = get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 get_buffer(pb, ffm->packet, ffm->packet_size - FFM_HEADER_SIZE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
354 ffm->packet_end = ffm->packet + (ffm->packet_size - FFM_HEADER_SIZE - fill_size);
318
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
355 if (ffm->packet_end < ffm->packet)
537
558a093b04db do not call (av_)abort()
michael
parents: 502
diff changeset
356 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
357 /* if first packet or resynchronization packet, we must
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
358 handle it specifically */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
359 if (ffm->first_packet || (frame_offset & 0x8000)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
360 if (!frame_offset) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 /* This packet has no frame headers in it */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362 if (url_ftell(pb) >= ffm->packet_size * 3) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
363 url_fseek(pb, -ffm->packet_size * 2, SEEK_CUR);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
364 goto retry_read;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
365 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
366 /* This is bad, we cannot find a valid frame header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
367 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
368 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
369 ffm->first_packet = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 if ((frame_offset & 0x7ffff) < FFM_HEADER_SIZE)
537
558a093b04db do not call (av_)abort()
michael
parents: 502
diff changeset
371 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
372 ffm->packet_ptr = ffm->packet + (frame_offset & 0x7fff) - FFM_HEADER_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
373 if (!first)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
374 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376 ffm->packet_ptr = ffm->packet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
377 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378 goto redo;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 memcpy(buf, ffm->packet_ptr, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 buf += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382 ffm->packet_ptr += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 size -= len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 first = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386 return size1 - size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
388
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389
318
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
390 static void adjust_write_index(AVFormatContext *s)
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
391 {
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
392 FFMContext *ffm = s->priv_data;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
393 ByteIOContext *pb = &s->pb;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
394 int64_t pts;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
395 //offset_t orig_write_index = ffm->write_index;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
396 offset_t pos_min, pos_max;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
397 int64_t pts_start;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
398 offset_t ptr = url_ftell(pb);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
399
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
400
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
401 pos_min = 0;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
402 pos_max = ffm->file_size - 2 * FFM_PACKET_SIZE;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
403
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
404 pts_start = get_pts(s, pos_min);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
405
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
406 pts = get_pts(s, pos_max);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
407
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 862
diff changeset
408 if (pts - 100000 > pts_start)
390
3a40642dc4df adjust_write_index() fix by ("Curi Fabio Eduardo (SFL)" <curif at TELEFONICA dot COM dot AR>)
michael
parents: 318
diff changeset
409 goto end;
318
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
410
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
411 ffm->write_index = FFM_PACKET_SIZE;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
412
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
413 pts_start = get_pts(s, pos_min);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
414
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
415 pts = get_pts(s, pos_max);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
416
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
417 if (pts - 100000 <= pts_start) {
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
418 while (1) {
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
419 offset_t newpos;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
420 int64_t newpts;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
421
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
422 newpos = ((pos_max + pos_min) / (2 * FFM_PACKET_SIZE)) * FFM_PACKET_SIZE;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
423
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
424 if (newpos == pos_min)
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
425 break;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
426
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
427 newpts = get_pts(s, newpos);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
428
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
429 if (newpts - 100000 <= pts) {
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
430 pos_max = newpos;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
431 pts = newpts;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
432 } else {
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
433 pos_min = newpos;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
434 }
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
435 }
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
436 ffm->write_index += pos_max;
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
437 }
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
438
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
439 //printf("Adjusted write index from %lld to %lld: pts=%0.6f\n", orig_write_index, ffm->write_index, pts / 1000000.);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
440 //printf("pts range %0.6f - %0.6f\n", get_pts(s, 0) / 1000000. , get_pts(s, ffm->file_size - 2 * FFM_PACKET_SIZE) / 1000000. );
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
441
390
3a40642dc4df adjust_write_index() fix by ("Curi Fabio Eduardo (SFL)" <curif at TELEFONICA dot COM dot AR>)
michael
parents: 318
diff changeset
442 end:
318
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
443 url_fseek(pb, ptr, SEEK_SET);
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
444 }
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
445
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
446
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447 static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451 FFMStream *fst;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
452 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453 AVCodecContext *codec;
187
2fa5e94ba716 add av_new_stream() usage
bellard
parents: 85
diff changeset
454 int i, nb_streams;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
455 uint32_t tag;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457 /* header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 tag = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
459 if (tag != MKTAG('F', 'F', 'M', '1'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
460 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 ffm->packet_size = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 if (ffm->packet_size != FFM_PACKET_SIZE)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464 ffm->write_index = get_be64(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465 /* get also filesize */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 if (!url_is_streamed(pb)) {
764
cdb845a57ae4 drop most url_fileno() calls (allows to use ByteIOContext directly in caller apps instead of URLProtocol)
aurel
parents: 751
diff changeset
467 ffm->file_size = url_fsize(pb);
318
54e915169d48 Add more resilience in reading ffm files. In particular, don't assume
philipjsg
parents: 277
diff changeset
468 adjust_write_index(s);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
469 } else {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
470 ffm->file_size = (uint64_t_C(1) << 63) - 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
471 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
472
187
2fa5e94ba716 add av_new_stream() usage
bellard
parents: 85
diff changeset
473 nb_streams = get_be32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474 get_be32(pb); /* total bitrate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
475 /* read each stream */
187
2fa5e94ba716 add av_new_stream() usage
bellard
parents: 85
diff changeset
476 for(i=0;i<nb_streams;i++) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
477 char rc_eq_buf[128];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
478
187
2fa5e94ba716 add av_new_stream() usage
bellard
parents: 85
diff changeset
479 st = av_new_stream(s, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
480 if (!st)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
481 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
482 fst = av_mallocz(sizeof(FFMStream));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
483 if (!fst)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
484 goto fail;
862
aa0abab5e320 fix feed read_header, avoid using put_tag in write_header, to be consistent with read_header, also some minor cosmetics
alex
parents: 858
diff changeset
485 s->streams[i] = st;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 862
diff changeset
486
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 390
diff changeset
487 av_set_pts_info(st, 64, 1, 1000000);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 862
diff changeset
488
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
489 st->priv_data = fst;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
490
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 775
diff changeset
491 codec = st->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
492 /* generic info */
862
aa0abab5e320 fix feed read_header, avoid using put_tag in write_header, to be consistent with read_header, also some minor cosmetics
alex
parents: 858
diff changeset
493 codec->codec_id = get_be32(pb);
aa0abab5e320 fix feed read_header, avoid using put_tag in write_header, to be consistent with read_header, also some minor cosmetics
alex
parents: 858
diff changeset
494 codec->codec_type = get_byte(pb); /* codec_type */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
495 codec->bit_rate = get_be32(pb);
862
aa0abab5e320 fix feed read_header, avoid using put_tag in write_header, to be consistent with read_header, also some minor cosmetics
alex
parents: 858
diff changeset
496 st->quality = get_be32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
497 codec->flags = get_be32(pb);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
498 codec->flags2 = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
499 codec->debug = get_be32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
500 /* specific info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
501 switch(codec->codec_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
502 case CODEC_TYPE_VIDEO:
743
af4e24d6310c switch to native time bases
michael
parents: 683
diff changeset
503 codec->time_base.num = get_be32(pb);
af4e24d6310c switch to native time bases
michael
parents: 683
diff changeset
504 codec->time_base.den = get_be32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
505 codec->width = get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
506 codec->height = get_be16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
507 codec->gop_size = get_be16(pb);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
508 codec->pix_fmt = get_be32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
509 codec->qmin = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
510 codec->qmax = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
511 codec->max_qdiff = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
512 codec->qcompress = get_be16(pb) / 10000.0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
513 codec->qblur = get_be16(pb) / 10000.0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
514 codec->bit_rate_tolerance = get_be32(pb);
34
f17e285df237 use av_strdup()
bellard
parents: 7
diff changeset
515 codec->rc_eq = av_strdup(get_strz(pb, rc_eq_buf, sizeof(rc_eq_buf)));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
516 codec->rc_max_rate = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
517 codec->rc_min_rate = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
518 codec->rc_buffer_size = get_be32(pb);
823
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
519 codec->i_quant_factor = av_int2dbl(get_be64(pb));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
520 codec->b_quant_factor = av_int2dbl(get_be64(pb));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
521 codec->i_quant_offset = av_int2dbl(get_be64(pb));
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
522 codec->b_quant_offset = av_int2dbl(get_be64(pb));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
523 codec->dct_algo = get_be32(pb);
744
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
524 codec->strict_std_compliance = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
525 codec->max_b_frames = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
526 codec->luma_elim_threshold = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
527 codec->chroma_elim_threshold = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
528 codec->mpeg_quant = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
529 codec->intra_dc_precision = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
530 codec->me_method = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
531 codec->mb_decision = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
532 codec->nsse_weight = get_be32(pb);
da5b3b9e898e Add in many fields that have been added to the Codec structure. This means
philipjsg
parents: 743
diff changeset
533 codec->frame_skip_cmp = get_be32(pb);
823
e8b4454b997d remove non portable get/put_be64_double()
michael
parents: 820
diff changeset
534 codec->rc_buffer_aggressivity = av_int2dbl(get_be64(pb));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
535 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
536 case CODEC_TYPE_AUDIO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
537 codec->sample_rate = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
538 codec->channels = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
539 codec->frame_size = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
540 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
541 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
542 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
543 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
544
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
545 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
546
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
547 /* get until end of block reached */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
548 while ((url_ftell(pb) % ffm->packet_size) != 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
549 get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
550
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
551 /* init packet demux */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
552 ffm->packet_ptr = ffm->packet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
553 ffm->packet_end = ffm->packet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
554 ffm->frame_offset = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
555 ffm->pts = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
556 ffm->read_state = READ_HEADER;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
557 ffm->first_packet = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
558 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
559 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
560 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
561 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
562 if (st) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
563 av_freep(&st->priv_data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
564 av_free(st);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
565 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
566 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
567 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
568 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
569
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
570 /* return < 0 if eof */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
571 static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
572 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
573 int size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
574 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
575 int duration;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
576
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
577 switch(ffm->read_state) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
578 case READ_HEADER:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
579 if (!ffm_is_avail_data(s, FRAME_HEADER_SIZE)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
580 return -EAGAIN;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
581 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
582 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
583 printf("pos=%08Lx spos=%Lx, write_index=%Lx size=%Lx\n",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
584 url_ftell(&s->pb), s->pb.pos, ffm->write_index, ffm->file_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
585 #endif
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 862
diff changeset
586 if (ffm_read_data(s, ffm->header, FRAME_HEADER_SIZE, 1) !=
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
587 FRAME_HEADER_SIZE)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
588 return -EAGAIN;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
589 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
590 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
591 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
592 for(i=0;i<FRAME_HEADER_SIZE;i++)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
593 printf("%02x ", ffm->header[i]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
594 printf("\n");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
595 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
596 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
597 ffm->read_state = READ_DATA;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
598 /* fall thru */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
599 case READ_DATA:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
600 size = (ffm->header[2] << 16) | (ffm->header[3] << 8) | ffm->header[4];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
601 if (!ffm_is_avail_data(s, size)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
602 return -EAGAIN;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
603 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
604
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 duration = (ffm->header[5] << 16) | (ffm->header[6] << 8) | ffm->header[7];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
606
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
607 av_new_packet(pkt, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
608 pkt->stream_index = ffm->header[0];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 862
diff changeset
609 pkt->pos = url_ftell(&s->pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
610 if (ffm->header[1] & FLAG_KEY_FRAME)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
611 pkt->flags |= PKT_FLAG_KEY;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
612
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
613 ffm->read_state = READ_HEADER;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
614 if (ffm_read_data(s, pkt->data, size, 0) != size) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
615 /* bad case: desynchronized packet. we cancel all the packet loading */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
616 av_free_packet(pkt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
617 return -EAGAIN;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
618 }
901
c1a07d63a66d pts fix by (Bryan Mayland / bmayland O leoninedev o com)
michael
parents: 896
diff changeset
619 if (ffm->first_frame_in_packet)
c1a07d63a66d pts fix by (Bryan Mayland / bmayland O leoninedev o com)
michael
parents: 896
diff changeset
620 {
c1a07d63a66d pts fix by (Bryan Mayland / bmayland O leoninedev o com)
michael
parents: 896
diff changeset
621 pkt->pts = ffm->pts;
c1a07d63a66d pts fix by (Bryan Mayland / bmayland O leoninedev o com)
michael
parents: 896
diff changeset
622 ffm->first_frame_in_packet = 0;
c1a07d63a66d pts fix by (Bryan Mayland / bmayland O leoninedev o com)
michael
parents: 896
diff changeset
623 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
624 pkt->duration = duration;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
625 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
626 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
627 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
628 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
629
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
630 //#define DEBUG_SEEK
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
631
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
632 /* pos is between 0 and file_size - FFM_PACKET_SIZE. It is translated
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
633 by the write position inside this function */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
634 static void ffm_seek1(AVFormatContext *s, offset_t pos1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
635 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
636 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
637 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
638 offset_t pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
639
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
640 pos = pos1 + ffm->write_index;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
641 if (pos >= ffm->file_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
642 pos -= (ffm->file_size - FFM_PACKET_SIZE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
643 #ifdef DEBUG_SEEK
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
644 printf("seek to %Lx -> %Lx\n", pos1, pos);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
645 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
646 url_fseek(pb, pos, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
647 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
648
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
649 static int64_t get_pts(AVFormatContext *s, offset_t pos)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
650 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
651 ByteIOContext *pb = &s->pb;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
652 int64_t pts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
653
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
654 ffm_seek1(s, pos);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
655 url_fskip(pb, 4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
656 pts = get_be64(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
657 #ifdef DEBUG_SEEK
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
658 printf("pts=%0.6f\n", pts / 1000000.0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
659 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
660 return pts;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
661 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
662
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
663 /* seek to a given time in the file. The file read pointer is
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
664 positionned at or before pts. XXX: the following code is quite
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
665 approximative */
558
89bd76208427 100l (forgoten seeking functions)
michael
parents: 540
diff changeset
666 static int ffm_seek(AVFormatContext *s, int stream_index, int64_t wanted_pts, int flags)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
667 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
668 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
669 offset_t pos_min, pos_max, pos;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
670 int64_t pts_min, pts_max, pts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
671 double pos1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
672
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
673 #ifdef DEBUG_SEEK
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
674 printf("wanted_pts=%0.6f\n", wanted_pts / 1000000.0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
675 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
676 /* find the position using linear interpolation (better than
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
677 dichotomy in typical cases) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
678 pos_min = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
679 pos_max = ffm->file_size - 2 * FFM_PACKET_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
680 while (pos_min <= pos_max) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
681 pts_min = get_pts(s, pos_min);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
682 pts_max = get_pts(s, pos_max);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
683 /* linear interpolation */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
684 pos1 = (double)(pos_max - pos_min) * (double)(wanted_pts - pts_min) /
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
685 (double)(pts_max - pts_min);
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
686 pos = (((int64_t)pos1) / FFM_PACKET_SIZE) * FFM_PACKET_SIZE;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
687 if (pos <= pos_min)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
688 pos = pos_min;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
689 else if (pos >= pos_max)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
690 pos = pos_max;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
691 pts = get_pts(s, pos);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
692 /* check if we are lucky */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
693 if (pts == wanted_pts) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
694 goto found;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
695 } else if (pts > wanted_pts) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
696 pos_max = pos - FFM_PACKET_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
697 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
698 pos_min = pos + FFM_PACKET_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
699 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
700 }
558
89bd76208427 100l (forgoten seeking functions)
michael
parents: 540
diff changeset
701 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
702 if (pos > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
703 pos -= FFM_PACKET_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
704 found:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
705 ffm_seek1(s, pos);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
706 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
707 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
708
905
dbc0145bbf11 Add --disable-protocols option to configure to disable I/O protocol from
diego
parents: 901
diff changeset
709 #ifdef CONFIG_FFSERVER
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
710 offset_t ffm_read_write_index(int fd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
711 {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
712 uint8_t buf[8];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
713 offset_t pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
714 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
715
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
716 lseek(fd, 8, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
717 read(fd, buf, 8);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
718 pos = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
719 for(i=0;i<8;i++)
187
2fa5e94ba716 add av_new_stream() usage
bellard
parents: 85
diff changeset
720 pos |= (int64_t)buf[i] << (56 - i * 8);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
721 return pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
722 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
723
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
724 void ffm_write_write_index(int fd, offset_t pos)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
725 {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 34
diff changeset
726 uint8_t buf[8];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
727 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
728
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
729 for(i=0;i<8;i++)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
730 buf[i] = (pos >> (56 - i * 8)) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
731 lseek(fd, 8, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
732 write(fd, buf, 8);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
733 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
734
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
735 void ffm_set_write_index(AVFormatContext *s, offset_t pos, offset_t file_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
736 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
737 FFMContext *ffm = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
738 ffm->write_index = pos;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
739 ffm->file_size = file_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
740 }
905
dbc0145bbf11 Add --disable-protocols option to configure to disable I/O protocol from
diego
parents: 901
diff changeset
741 #endif // CONFIG_FFSERVER
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
742
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
743 static int ffm_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
744 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
745 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
746 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
747
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
748 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
749 st = s->streams[i];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
750 av_freep(&st->priv_data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
751 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
752 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
753 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
754
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
755 static int ffm_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
756 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
757 if (p->buf_size >= 4 &&
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 862
diff changeset
758 p->buf[0] == 'F' && p->buf[1] == 'F' && p->buf[2] == 'M' &&
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
759 p->buf[3] == '1')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
760 return AVPROBE_SCORE_MAX + 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
761 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
762 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
763
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
764 #ifdef CONFIG_FFM_DEMUXER
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
765 AVInputFormat ffm_demuxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
766 "ffm",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
767 "ffm format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768 sizeof(FFMContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
769 ffm_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
770 ffm_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 ffm_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772 ffm_read_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773 ffm_seek,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
775 #endif
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
776 #ifdef CONFIG_FFM_MUXER
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
777 AVOutputFormat ffm_muxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778 "ffm",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779 "ffm format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
780 "",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
781 "ffm",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782 sizeof(FFMContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
783 /* not really used */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
784 CODEC_ID_MP2,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
785 CODEC_ID_MPEG1VIDEO,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
786 ffm_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
787 ffm_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
788 ffm_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
789 };
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
790 #endif //CONFIG_FFM_MUXER