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