Mercurial > libavformat.hg
comparison rawdec.c @ 6448:4775a49a6045 libavformat
split raw.c into rawdec.c and rawenc.c
author | aurel |
---|---|
date | Mon, 30 Aug 2010 23:16:35 +0000 |
parents | raw.c@ef0ad6df55b2 |
children | eb68008daac2 |
comparison
equal
deleted
inserted
replaced
6447:ef0ad6df55b2 | 6448:4775a49a6045 |
---|---|
1 /* | |
2 * RAW demuxers | |
3 * Copyright (c) 2001 Fabrice Bellard | |
4 * Copyright (c) 2005 Alex Beregszaszi | |
5 * | |
6 * This file is part of FFmpeg. | |
7 * | |
8 * FFmpeg is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2.1 of the License, or (at your option) any later version. | |
12 * | |
13 * FFmpeg is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with FFmpeg; if not, write to the Free Software | |
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 */ | |
22 | |
23 #include "avformat.h" | |
24 #include "rawdec.h" | |
25 | |
26 /* raw input */ | |
27 int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap) | |
28 { | |
29 AVStream *st; | |
30 enum CodecID id; | |
31 | |
32 st = av_new_stream(s, 0); | |
33 if (!st) | |
34 return AVERROR(ENOMEM); | |
35 | |
36 id = s->iformat->value; | |
37 if (id == CODEC_ID_RAWVIDEO) { | |
38 st->codec->codec_type = AVMEDIA_TYPE_VIDEO; | |
39 } else { | |
40 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; | |
41 } | |
42 st->codec->codec_id = id; | |
43 | |
44 switch(st->codec->codec_type) { | |
45 case AVMEDIA_TYPE_AUDIO: | |
46 st->codec->sample_rate = ap->sample_rate; | |
47 if(ap->channels) st->codec->channels = ap->channels; | |
48 else st->codec->channels = 1; | |
49 st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id); | |
50 assert(st->codec->bits_per_coded_sample > 0); | |
51 st->codec->block_align = st->codec->bits_per_coded_sample*st->codec->channels/8; | |
52 av_set_pts_info(st, 64, 1, st->codec->sample_rate); | |
53 break; | |
54 case AVMEDIA_TYPE_VIDEO: | |
55 if(ap->time_base.num) | |
56 av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den); | |
57 else | |
58 av_set_pts_info(st, 64, 1, 25); | |
59 st->codec->width = ap->width; | |
60 st->codec->height = ap->height; | |
61 st->codec->pix_fmt = ap->pix_fmt; | |
62 if(st->codec->pix_fmt == PIX_FMT_NONE) | |
63 st->codec->pix_fmt= PIX_FMT_YUV420P; | |
64 break; | |
65 default: | |
66 return -1; | |
67 } | |
68 return 0; | |
69 } | |
70 | |
71 #define RAW_PACKET_SIZE 1024 | |
72 | |
73 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) | |
74 { | |
75 int ret, size; | |
76 | |
77 size = RAW_PACKET_SIZE; | |
78 | |
79 if (av_new_packet(pkt, size) < 0) | |
80 return AVERROR(ENOMEM); | |
81 | |
82 pkt->pos= url_ftell(s->pb); | |
83 pkt->stream_index = 0; | |
84 ret = get_partial_buffer(s->pb, pkt->data, size); | |
85 if (ret < 0) { | |
86 av_free_packet(pkt); | |
87 return ret; | |
88 } | |
89 pkt->size = ret; | |
90 return ret; | |
91 } | |
92 | |
93 int ff_raw_audio_read_header(AVFormatContext *s, | |
94 AVFormatParameters *ap) | |
95 { | |
96 AVStream *st = av_new_stream(s, 0); | |
97 if (!st) | |
98 return AVERROR(ENOMEM); | |
99 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; | |
100 st->codec->codec_id = s->iformat->value; | |
101 st->need_parsing = AVSTREAM_PARSE_FULL; | |
102 /* the parameters will be extracted from the compressed bitstream */ | |
103 | |
104 return 0; | |
105 } | |
106 | |
107 /* MPEG-1/H.263 input */ | |
108 int ff_raw_video_read_header(AVFormatContext *s, | |
109 AVFormatParameters *ap) | |
110 { | |
111 AVStream *st; | |
112 | |
113 st = av_new_stream(s, 0); | |
114 if (!st) | |
115 return AVERROR(ENOMEM); | |
116 | |
117 st->codec->codec_type = AVMEDIA_TYPE_VIDEO; | |
118 st->codec->codec_id = s->iformat->value; | |
119 st->need_parsing = AVSTREAM_PARSE_FULL; | |
120 | |
121 /* for MJPEG, specify frame rate */ | |
122 /* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/ | |
123 if (ap->time_base.num) { | |
124 st->codec->time_base= ap->time_base; | |
125 } else if ( st->codec->codec_id == CODEC_ID_MJPEG || | |
126 st->codec->codec_id == CODEC_ID_MPEG4 || | |
127 st->codec->codec_id == CODEC_ID_DIRAC || | |
128 st->codec->codec_id == CODEC_ID_DNXHD || | |
129 st->codec->codec_id == CODEC_ID_VC1 || | |
130 st->codec->codec_id == CODEC_ID_H264) { | |
131 st->codec->time_base= (AVRational){1,25}; | |
132 } | |
133 av_set_pts_info(st, 64, 1, 1200000); | |
134 | |
135 return 0; | |
136 } | |
137 | |
138 /* Note: Do not forget to add new entries to the Makefile as well. */ | |
139 | |
140 #if CONFIG_GSM_DEMUXER | |
141 AVInputFormat gsm_demuxer = { | |
142 "gsm", | |
143 NULL_IF_CONFIG_SMALL("raw GSM"), | |
144 0, | |
145 NULL, | |
146 ff_raw_audio_read_header, | |
147 ff_raw_read_partial_packet, | |
148 .flags= AVFMT_GENERIC_INDEX, | |
149 .extensions = "gsm", | |
150 .value = CODEC_ID_GSM, | |
151 }; | |
152 #endif | |
153 | |
154 #if CONFIG_MJPEG_DEMUXER | |
155 AVInputFormat mjpeg_demuxer = { | |
156 "mjpeg", | |
157 NULL_IF_CONFIG_SMALL("raw MJPEG video"), | |
158 0, | |
159 NULL, | |
160 ff_raw_video_read_header, | |
161 ff_raw_read_partial_packet, | |
162 .flags= AVFMT_GENERIC_INDEX, | |
163 .extensions = "mjpg,mjpeg", | |
164 .value = CODEC_ID_MJPEG, | |
165 }; | |
166 #endif | |
167 | |
168 #if CONFIG_MLP_DEMUXER | |
169 AVInputFormat mlp_demuxer = { | |
170 "mlp", | |
171 NULL_IF_CONFIG_SMALL("raw MLP"), | |
172 0, | |
173 NULL, | |
174 ff_raw_audio_read_header, | |
175 ff_raw_read_partial_packet, | |
176 .flags= AVFMT_GENERIC_INDEX, | |
177 .extensions = "mlp", | |
178 .value = CODEC_ID_MLP, | |
179 }; | |
180 #endif | |
181 | |
182 #if CONFIG_TRUEHD_DEMUXER | |
183 AVInputFormat truehd_demuxer = { | |
184 "truehd", | |
185 NULL_IF_CONFIG_SMALL("raw TrueHD"), | |
186 0, | |
187 NULL, | |
188 ff_raw_audio_read_header, | |
189 ff_raw_read_partial_packet, | |
190 .flags= AVFMT_GENERIC_INDEX, | |
191 .extensions = "thd", | |
192 .value = CODEC_ID_TRUEHD, | |
193 }; | |
194 #endif | |
195 | |
196 #if CONFIG_SHORTEN_DEMUXER | |
197 AVInputFormat shorten_demuxer = { | |
198 "shn", | |
199 NULL_IF_CONFIG_SMALL("raw Shorten"), | |
200 0, | |
201 NULL, | |
202 ff_raw_audio_read_header, | |
203 ff_raw_read_partial_packet, | |
204 .flags= AVFMT_GENERIC_INDEX, | |
205 .extensions = "shn", | |
206 .value = CODEC_ID_SHORTEN, | |
207 }; | |
208 #endif | |
209 | |
210 #if CONFIG_VC1_DEMUXER | |
211 AVInputFormat vc1_demuxer = { | |
212 "vc1", | |
213 NULL_IF_CONFIG_SMALL("raw VC-1"), | |
214 0, | |
215 NULL /* vc1_probe */, | |
216 ff_raw_video_read_header, | |
217 ff_raw_read_partial_packet, | |
218 .extensions = "vc1", | |
219 .value = CODEC_ID_VC1, | |
220 }; | |
221 #endif |