Libav 0.7.1
|
00001 /* 00002 * RAW demuxers 00003 * Copyright (c) 2001 Fabrice Bellard 00004 * Copyright (c) 2005 Alex Beregszaszi 00005 * 00006 * This file is part of Libav. 00007 * 00008 * Libav is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU Lesser General Public 00010 * License as published by the Free Software Foundation; either 00011 * version 2.1 of the License, or (at your option) any later version. 00012 * 00013 * Libav is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with Libav; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00021 */ 00022 00023 #include "avformat.h" 00024 #include "avio_internal.h" 00025 #include "rawdec.h" 00026 #include "libavutil/opt.h" 00027 #include "libavutil/parseutils.h" 00028 #include "libavutil/pixdesc.h" 00029 00030 /* raw input */ 00031 int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap) 00032 { 00033 AVStream *st; 00034 enum CodecID id; 00035 00036 st = av_new_stream(s, 0); 00037 if (!st) 00038 return AVERROR(ENOMEM); 00039 00040 id = s->iformat->value; 00041 if (id == CODEC_ID_RAWVIDEO) { 00042 st->codec->codec_type = AVMEDIA_TYPE_VIDEO; 00043 } else { 00044 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; 00045 } 00046 st->codec->codec_id = id; 00047 00048 switch(st->codec->codec_type) { 00049 case AVMEDIA_TYPE_AUDIO: { 00050 RawAudioDemuxerContext *s1 = s->priv_data; 00051 00052 #if FF_API_FORMAT_PARAMETERS 00053 if (ap->sample_rate) 00054 st->codec->sample_rate = ap->sample_rate; 00055 if (ap->channels) 00056 st->codec->channels = ap->channels; 00057 else st->codec->channels = 1; 00058 #endif 00059 00060 if (s1->sample_rate) 00061 st->codec->sample_rate = s1->sample_rate; 00062 if (s1->channels) 00063 st->codec->channels = s1->channels; 00064 00065 st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id); 00066 assert(st->codec->bits_per_coded_sample > 0); 00067 st->codec->block_align = st->codec->bits_per_coded_sample*st->codec->channels/8; 00068 av_set_pts_info(st, 64, 1, st->codec->sample_rate); 00069 break; 00070 } 00071 case AVMEDIA_TYPE_VIDEO: { 00072 FFRawVideoDemuxerContext *s1 = s->priv_data; 00073 int width = 0, height = 0, ret = 0; 00074 enum PixelFormat pix_fmt; 00075 AVRational framerate; 00076 00077 if (s1->video_size && (ret = av_parse_video_size(&width, &height, s1->video_size)) < 0) { 00078 av_log(s, AV_LOG_ERROR, "Couldn't parse video size.\n"); 00079 goto fail; 00080 } 00081 if ((pix_fmt = av_get_pix_fmt(s1->pixel_format)) == PIX_FMT_NONE) { 00082 av_log(s, AV_LOG_ERROR, "No such pixel format: %s.\n", s1->pixel_format); 00083 ret = AVERROR(EINVAL); 00084 goto fail; 00085 } 00086 if ((ret = av_parse_video_rate(&framerate, s1->framerate)) < 0) { 00087 av_log(s, AV_LOG_ERROR, "Could not parse framerate: %s.\n", s1->framerate); 00088 goto fail; 00089 } 00090 #if FF_API_FORMAT_PARAMETERS 00091 if (ap->width > 0) 00092 width = ap->width; 00093 if (ap->height > 0) 00094 height = ap->height; 00095 if (ap->pix_fmt) 00096 pix_fmt = ap->pix_fmt; 00097 if (ap->time_base.num) 00098 framerate = (AVRational){ap->time_base.den, ap->time_base.num}; 00099 #endif 00100 av_set_pts_info(st, 64, framerate.den, framerate.num); 00101 st->codec->width = width; 00102 st->codec->height = height; 00103 st->codec->pix_fmt = pix_fmt; 00104 fail: 00105 return ret; 00106 } 00107 default: 00108 return -1; 00109 } 00110 return 0; 00111 } 00112 00113 #define RAW_PACKET_SIZE 1024 00114 00115 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) 00116 { 00117 int ret, size; 00118 00119 size = RAW_PACKET_SIZE; 00120 00121 if (av_new_packet(pkt, size) < 0) 00122 return AVERROR(ENOMEM); 00123 00124 pkt->pos= avio_tell(s->pb); 00125 pkt->stream_index = 0; 00126 ret = ffio_read_partial(s->pb, pkt->data, size); 00127 if (ret < 0) { 00128 av_free_packet(pkt); 00129 return ret; 00130 } 00131 pkt->size = ret; 00132 return ret; 00133 } 00134 00135 int ff_raw_audio_read_header(AVFormatContext *s, 00136 AVFormatParameters *ap) 00137 { 00138 AVStream *st = av_new_stream(s, 0); 00139 if (!st) 00140 return AVERROR(ENOMEM); 00141 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; 00142 st->codec->codec_id = s->iformat->value; 00143 st->need_parsing = AVSTREAM_PARSE_FULL; 00144 /* the parameters will be extracted from the compressed bitstream */ 00145 00146 return 0; 00147 } 00148 00149 /* MPEG-1/H.263 input */ 00150 int ff_raw_video_read_header(AVFormatContext *s, 00151 AVFormatParameters *ap) 00152 { 00153 AVStream *st; 00154 FFRawVideoDemuxerContext *s1 = s->priv_data; 00155 AVRational framerate; 00156 int ret = 0; 00157 00158 00159 st = av_new_stream(s, 0); 00160 if (!st) { 00161 ret = AVERROR(ENOMEM); 00162 goto fail; 00163 } 00164 00165 st->codec->codec_type = AVMEDIA_TYPE_VIDEO; 00166 st->codec->codec_id = s->iformat->value; 00167 st->need_parsing = AVSTREAM_PARSE_FULL; 00168 00169 if ((ret = av_parse_video_rate(&framerate, s1->framerate)) < 0) { 00170 av_log(s, AV_LOG_ERROR, "Could not parse framerate: %s.\n", s1->framerate); 00171 goto fail; 00172 } 00173 #if FF_API_FORMAT_PARAMETERS 00174 if (ap->time_base.num) 00175 framerate = (AVRational){ap->time_base.den, ap->time_base.num}; 00176 #endif 00177 00178 st->codec->time_base = (AVRational){framerate.den, framerate.num}; 00179 av_set_pts_info(st, 64, 1, 1200000); 00180 00181 fail: 00182 return ret; 00183 } 00184 00185 /* Note: Do not forget to add new entries to the Makefile as well. */ 00186 00187 static const AVOption audio_options[] = { 00188 { "sample_rate", "", offsetof(RawAudioDemuxerContext, sample_rate), FF_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, 00189 { "channels", "", offsetof(RawAudioDemuxerContext, channels), FF_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, 00190 { NULL }, 00191 }; 00192 00193 const AVClass ff_rawaudio_demuxer_class = { 00194 .class_name = "rawaudio demuxer", 00195 .item_name = av_default_item_name, 00196 .option = audio_options, 00197 .version = LIBAVUTIL_VERSION_INT, 00198 }; 00199 00200 #define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x) 00201 #define DEC AV_OPT_FLAG_DECODING_PARAM 00202 static const AVOption video_options[] = { 00203 { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, 00204 { "pixel_format", "", OFFSET(pixel_format), FF_OPT_TYPE_STRING, {.str = "yuv420p"}, 0, 0, DEC }, 00205 { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC }, 00206 { NULL }, 00207 }; 00208 #undef OFFSET 00209 #undef DEC 00210 00211 const AVClass ff_rawvideo_demuxer_class = { 00212 .class_name = "rawvideo demuxer", 00213 .item_name = av_default_item_name, 00214 .option = video_options, 00215 .version = LIBAVUTIL_VERSION_INT, 00216 }; 00217 00218 #if CONFIG_G722_DEMUXER 00219 AVInputFormat ff_g722_demuxer = { 00220 "g722", 00221 NULL_IF_CONFIG_SMALL("raw G.722"), 00222 sizeof(RawAudioDemuxerContext), 00223 NULL, 00224 ff_raw_read_header, 00225 ff_raw_read_partial_packet, 00226 .flags= AVFMT_GENERIC_INDEX, 00227 .extensions = "g722,722", 00228 .value = CODEC_ID_ADPCM_G722, 00229 .priv_class = &ff_rawaudio_demuxer_class, 00230 }; 00231 #endif 00232 00233 #if CONFIG_GSM_DEMUXER 00234 AVInputFormat ff_gsm_demuxer = { 00235 "gsm", 00236 NULL_IF_CONFIG_SMALL("raw GSM"), 00237 0, 00238 NULL, 00239 ff_raw_audio_read_header, 00240 ff_raw_read_partial_packet, 00241 .flags= AVFMT_GENERIC_INDEX, 00242 .extensions = "gsm", 00243 .value = CODEC_ID_GSM, 00244 }; 00245 #endif 00246 00247 #if CONFIG_MJPEG_DEMUXER 00248 FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", NULL, "mjpg,mjpeg", CODEC_ID_MJPEG) 00249 #endif 00250 00251 #if CONFIG_MLP_DEMUXER 00252 AVInputFormat ff_mlp_demuxer = { 00253 "mlp", 00254 NULL_IF_CONFIG_SMALL("raw MLP"), 00255 0, 00256 NULL, 00257 ff_raw_audio_read_header, 00258 ff_raw_read_partial_packet, 00259 .flags= AVFMT_GENERIC_INDEX, 00260 .extensions = "mlp", 00261 .value = CODEC_ID_MLP, 00262 }; 00263 #endif 00264 00265 #if CONFIG_TRUEHD_DEMUXER 00266 AVInputFormat ff_truehd_demuxer = { 00267 "truehd", 00268 NULL_IF_CONFIG_SMALL("raw TrueHD"), 00269 0, 00270 NULL, 00271 ff_raw_audio_read_header, 00272 ff_raw_read_partial_packet, 00273 .flags= AVFMT_GENERIC_INDEX, 00274 .extensions = "thd", 00275 .value = CODEC_ID_TRUEHD, 00276 }; 00277 #endif 00278 00279 #if CONFIG_SHORTEN_DEMUXER 00280 AVInputFormat ff_shorten_demuxer = { 00281 "shn", 00282 NULL_IF_CONFIG_SMALL("raw Shorten"), 00283 0, 00284 NULL, 00285 ff_raw_audio_read_header, 00286 ff_raw_read_partial_packet, 00287 .flags= AVFMT_GENERIC_INDEX, 00288 .extensions = "shn", 00289 .value = CODEC_ID_SHORTEN, 00290 }; 00291 #endif 00292 00293 #if CONFIG_VC1_DEMUXER 00294 FF_DEF_RAWVIDEO_DEMUXER(vc1, "raw VC-1", NULL, "vc1", CODEC_ID_VC1) 00295 #endif