00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "avformat.h"
00024 #include "avio_internal.h"
00025 #include "rawdec.h"
00026
00027
00028 int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
00029 {
00030 AVStream *st;
00031 enum CodecID id;
00032
00033 st = av_new_stream(s, 0);
00034 if (!st)
00035 return AVERROR(ENOMEM);
00036
00037 id = s->iformat->value;
00038 if (id == CODEC_ID_RAWVIDEO) {
00039 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
00040 } else {
00041 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
00042 }
00043 st->codec->codec_id = id;
00044
00045 switch(st->codec->codec_type) {
00046 case AVMEDIA_TYPE_AUDIO:
00047 st->codec->sample_rate = ap->sample_rate;
00048 if(ap->channels) st->codec->channels = ap->channels;
00049 else st->codec->channels = 1;
00050 st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id);
00051 assert(st->codec->bits_per_coded_sample > 0);
00052 st->codec->block_align = st->codec->bits_per_coded_sample*st->codec->channels/8;
00053 av_set_pts_info(st, 64, 1, st->codec->sample_rate);
00054 break;
00055 case AVMEDIA_TYPE_VIDEO:
00056 if(ap->time_base.num)
00057 av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
00058 else
00059 av_set_pts_info(st, 64, 1, 25);
00060 st->codec->width = ap->width;
00061 st->codec->height = ap->height;
00062 st->codec->pix_fmt = ap->pix_fmt;
00063 if(st->codec->pix_fmt == PIX_FMT_NONE)
00064 st->codec->pix_fmt= PIX_FMT_YUV420P;
00065 break;
00066 default:
00067 return -1;
00068 }
00069 return 0;
00070 }
00071
00072 #define RAW_PACKET_SIZE 1024
00073
00074 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
00075 {
00076 int ret, size;
00077
00078 size = RAW_PACKET_SIZE;
00079
00080 if (av_new_packet(pkt, size) < 0)
00081 return AVERROR(ENOMEM);
00082
00083 pkt->pos= avio_tell(s->pb);
00084 pkt->stream_index = 0;
00085 ret = ffio_read_partial(s->pb, pkt->data, size);
00086 if (ret < 0) {
00087 av_free_packet(pkt);
00088 return ret;
00089 }
00090 pkt->size = ret;
00091 return ret;
00092 }
00093
00094 int ff_raw_audio_read_header(AVFormatContext *s,
00095 AVFormatParameters *ap)
00096 {
00097 AVStream *st = av_new_stream(s, 0);
00098 if (!st)
00099 return AVERROR(ENOMEM);
00100 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
00101 st->codec->codec_id = s->iformat->value;
00102 st->need_parsing = AVSTREAM_PARSE_FULL;
00103
00104
00105 return 0;
00106 }
00107
00108
00109 int ff_raw_video_read_header(AVFormatContext *s,
00110 AVFormatParameters *ap)
00111 {
00112 AVStream *st;
00113
00114 st = av_new_stream(s, 0);
00115 if (!st)
00116 return AVERROR(ENOMEM);
00117
00118 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
00119 st->codec->codec_id = s->iformat->value;
00120 st->need_parsing = AVSTREAM_PARSE_FULL;
00121
00122
00123
00124 if (ap->time_base.num) {
00125 st->codec->time_base= ap->time_base;
00126 } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
00127 st->codec->codec_id == CODEC_ID_MPEG4 ||
00128 st->codec->codec_id == CODEC_ID_DIRAC ||
00129 st->codec->codec_id == CODEC_ID_DNXHD ||
00130 st->codec->codec_id == CODEC_ID_VC1 ||
00131 st->codec->codec_id == CODEC_ID_H264) {
00132 st->codec->time_base= (AVRational){1,25};
00133 }
00134 av_set_pts_info(st, 64, 1, 1200000);
00135
00136 return 0;
00137 }
00138
00139
00140
00141 #if CONFIG_G722_DEMUXER
00142 AVInputFormat ff_g722_demuxer = {
00143 "g722",
00144 NULL_IF_CONFIG_SMALL("raw G.722"),
00145 0,
00146 NULL,
00147 ff_raw_read_header,
00148 ff_raw_read_partial_packet,
00149 .flags= AVFMT_GENERIC_INDEX,
00150 .extensions = "g722,722",
00151 .value = CODEC_ID_ADPCM_G722,
00152 };
00153 #endif
00154
00155 #if CONFIG_GSM_DEMUXER
00156 AVInputFormat ff_gsm_demuxer = {
00157 "gsm",
00158 NULL_IF_CONFIG_SMALL("raw GSM"),
00159 0,
00160 NULL,
00161 ff_raw_audio_read_header,
00162 ff_raw_read_partial_packet,
00163 .flags= AVFMT_GENERIC_INDEX,
00164 .extensions = "gsm",
00165 .value = CODEC_ID_GSM,
00166 };
00167 #endif
00168
00169 #if CONFIG_MJPEG_DEMUXER
00170 AVInputFormat ff_mjpeg_demuxer = {
00171 "mjpeg",
00172 NULL_IF_CONFIG_SMALL("raw MJPEG video"),
00173 0,
00174 NULL,
00175 ff_raw_video_read_header,
00176 ff_raw_read_partial_packet,
00177 .flags= AVFMT_GENERIC_INDEX,
00178 .extensions = "mjpg,mjpeg",
00179 .value = CODEC_ID_MJPEG,
00180 };
00181 #endif
00182
00183 #if CONFIG_MLP_DEMUXER
00184 AVInputFormat ff_mlp_demuxer = {
00185 "mlp",
00186 NULL_IF_CONFIG_SMALL("raw MLP"),
00187 0,
00188 NULL,
00189 ff_raw_audio_read_header,
00190 ff_raw_read_partial_packet,
00191 .flags= AVFMT_GENERIC_INDEX,
00192 .extensions = "mlp",
00193 .value = CODEC_ID_MLP,
00194 };
00195 #endif
00196
00197 #if CONFIG_TRUEHD_DEMUXER
00198 AVInputFormat ff_truehd_demuxer = {
00199 "truehd",
00200 NULL_IF_CONFIG_SMALL("raw TrueHD"),
00201 0,
00202 NULL,
00203 ff_raw_audio_read_header,
00204 ff_raw_read_partial_packet,
00205 .flags= AVFMT_GENERIC_INDEX,
00206 .extensions = "thd",
00207 .value = CODEC_ID_TRUEHD,
00208 };
00209 #endif
00210
00211 #if CONFIG_SHORTEN_DEMUXER
00212 AVInputFormat ff_shorten_demuxer = {
00213 "shn",
00214 NULL_IF_CONFIG_SMALL("raw Shorten"),
00215 0,
00216 NULL,
00217 ff_raw_audio_read_header,
00218 ff_raw_read_partial_packet,
00219 .flags= AVFMT_GENERIC_INDEX,
00220 .extensions = "shn",
00221 .value = CODEC_ID_SHORTEN,
00222 };
00223 #endif
00224
00225 #if CONFIG_VC1_DEMUXER
00226 AVInputFormat ff_vc1_demuxer = {
00227 "vc1",
00228 NULL_IF_CONFIG_SMALL("raw VC-1"),
00229 0,
00230 NULL ,
00231 ff_raw_video_read_header,
00232 ff_raw_read_partial_packet,
00233 .extensions = "vc1",
00234 .value = CODEC_ID_VC1,
00235 };
00236 #endif