X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fraw.c;h=752dbf093127f6aa9bfc4fd284ba1608c7023186;hb=6c6ec47a0eb182a224941bb3f4eee72cb3634b16;hp=f48bbf7fff0724fd1e568076bd08c28d62d56ff7;hpb=115329f16062074e11ccf3b89ead6176606c9696;p=ffmpeg diff --git a/libavformat/raw.c b/libavformat/raw.c index f48bbf7fff0..752dbf09312 100644 --- a/libavformat/raw.c +++ b/libavformat/raw.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "avformat.h" @@ -26,6 +26,20 @@ static int raw_write_header(struct AVFormatContext *s) return 0; } +static int flac_write_header(struct AVFormatContext *s) +{ + static const uint8_t header[8] = { + 0x66, 0x4C, 0x61, 0x43, 0x80, 0x00, 0x00, 0x22 + }; + uint8_t *streaminfo = s->streams[0]->codec->extradata; + int len = s->streams[0]->codec->extradata_size; + if(streaminfo != NULL && len > 0) { + put_buffer(&s->pb, header, 8); + put_buffer(&s->pb, streaminfo, len); + } + return 0; +} + static int raw_write_packet(struct AVFormatContext *s, AVPacket *pkt) { put_buffer(&s->pb, pkt->data, pkt->size); @@ -48,7 +62,7 @@ static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap) st = av_new_stream(s, 0); if (!st) return AVERROR_NOMEM; - if (ap) { + id = s->iformat->value; if (id == CODEC_ID_RAWVIDEO) { st->codec->codec_type = CODEC_TYPE_VIDEO; @@ -74,9 +88,6 @@ static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap) default: return -1; } - } else { - return -1; - } return 0; } @@ -127,7 +138,7 @@ static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt) int ret, size, w, h, unk1, unk2; if (get_le32(&s->pb) != MKTAG('M', 'J', 'P', 'G')) - return AVERROR_IO; // FIXME + return AVERROR_IO; // FIXME size = get_le32(&s->pb); @@ -141,7 +152,7 @@ static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt) url_fskip(&s->pb, 22); // ascii timestamp av_log(NULL, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n", - size, w, h, unk1, unk2); + size, w, h, unk1, unk2); if (av_new_packet(pkt, size) < 0) return AVERROR_IO; @@ -239,6 +250,22 @@ static int shorten_read_header(AVFormatContext *s, return 0; } +/* flac read */ +static int flac_read_header(AVFormatContext *s, + AVFormatParameters *ap) +{ + AVStream *st; + + st = av_new_stream(s, 0); + if (!st) + return AVERROR_NOMEM; + st->codec->codec_type = CODEC_TYPE_AUDIO; + st->codec->codec_id = CODEC_ID_FLAC; + st->need_parsing = 1; + /* the parameters will be extracted from the compressed bitstream */ + return 0; +} + /* dts read */ static int dts_read_header(AVFormatContext *s, AVFormatParameters *ap) @@ -256,6 +283,23 @@ static int dts_read_header(AVFormatContext *s, return 0; } +/* aac read */ +static int aac_read_header(AVFormatContext *s, + AVFormatParameters *ap) +{ + AVStream *st; + + st = av_new_stream(s, 0); + if (!st) + return AVERROR_NOMEM; + + st->codec->codec_type = CODEC_TYPE_AUDIO; + st->codec->codec_id = CODEC_ID_AAC; + st->need_parsing = 1; + /* the parameters will be extracted from the compressed bitstream */ + return 0; +} + /* mpeg1/h263 input */ static int video_read_header(AVFormatContext *s, AVFormatParameters *ap) @@ -272,7 +316,7 @@ static int video_read_header(AVFormatContext *s, /* for mjpeg, specify frame rate */ /* for mpeg4 specify it too (most mpeg4 streams dont have the fixed_vop_rate set ...)*/ - if (ap && ap->time_base.num) { + if (ap->time_base.num) { av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den); } else if ( st->codec->codec_id == CODEC_ID_MJPEG || st->codec->codec_id == CODEC_ID_MPEG4 || @@ -283,34 +327,35 @@ static int video_read_header(AVFormatContext *s, return 0; } -#define SEQ_START_CODE 0x000001b3 -#define GOP_START_CODE 0x000001b8 -#define PICTURE_START_CODE 0x00000100 +#define SEQ_START_CODE 0x000001b3 +#define GOP_START_CODE 0x000001b8 +#define PICTURE_START_CODE 0x00000100 +#define SLICE_START_CODE 0x00000101 +#define PACK_START_CODE 0x000001ba +#define VIDEO_ID 0x000001e0 +#define AUDIO_ID 0x000001c0 -/* XXX: improve that by looking at several start codes */ static int mpegvideo_probe(AVProbeData *p) { - int code; - const uint8_t *d; - - /* we search the first start code. If it is a sequence, gop or - picture start code then we decide it is an mpeg video - stream. We do not send highest value to give a chance to mpegts */ - /* NOTE: the search range was restricted to avoid too many false - detections */ - - if (p->buf_size < 6) - return 0; - d = p->buf; - code = (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | (d[3]); - if ((code & 0xffffff00) == 0x100) { - if (code == SEQ_START_CODE || - code == GOP_START_CODE || - code == PICTURE_START_CODE) - return 50 - 1; - else - return 0; + uint32_t code= -1; + int pic=0, seq=0, slice=0, pspack=0, pes=0; + int i; + + for(i=0; ibuf_size; i++){ + code = (code<<8) + p->buf[i]; + if ((code & 0xffffff00) == 0x100) { + switch(code){ + case SEQ_START_CODE: seq++; break; + case PICTURE_START_CODE: pic++; break; + case SLICE_START_CODE: slice++; break; + case PACK_START_CODE: pspack++; break; + case VIDEO_ID: + case AUDIO_ID: pes++; break; + } + } } + if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes) + return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg return 0; } @@ -344,7 +389,7 @@ static int h261_probe(AVProbeData *p) return 0; } -AVInputFormat shorten_iformat = { +AVInputFormat shorten_demuxer = { "shn", "raw shorten", 0, @@ -355,7 +400,33 @@ AVInputFormat shorten_iformat = { .extensions = "shn", }; -AVInputFormat ac3_iformat = { +AVInputFormat flac_demuxer = { + "flac", + "raw flac", + 0, + NULL, + flac_read_header, + raw_read_partial_packet, + raw_read_close, + .extensions = "flac", +}; + +#ifdef CONFIG_MUXERS +AVOutputFormat flac_muxer = { + "flac", + "raw flac", + "audio/x-flac", + "flac", + 0, + CODEC_ID_FLAC, + 0, + flac_write_header, + raw_write_packet, + raw_write_trailer, +}; +#endif //CONFIG_MUXERS + +AVInputFormat ac3_demuxer = { "ac3", "raw ac3", 0, @@ -367,7 +438,7 @@ AVInputFormat ac3_iformat = { }; #ifdef CONFIG_MUXERS -AVOutputFormat ac3_oformat = { +AVOutputFormat ac3_muxer = { "ac3", "raw ac3", "audio/x-ac3", @@ -381,7 +452,7 @@ AVOutputFormat ac3_oformat = { }; #endif //CONFIG_MUXERS -AVInputFormat dts_iformat = { +AVInputFormat dts_demuxer = { "dts", "raw dts", 0, @@ -392,7 +463,18 @@ AVInputFormat dts_iformat = { .extensions = "dts", }; -AVInputFormat h261_iformat = { +AVInputFormat aac_demuxer = { + "aac", + "ADTS AAC", + 0, + NULL, + aac_read_header, + raw_read_partial_packet, + raw_read_close, + .extensions = "aac", +}; + +AVInputFormat h261_demuxer = { "h261", "raw h261", 0, @@ -405,7 +487,7 @@ AVInputFormat h261_iformat = { }; #ifdef CONFIG_MUXERS -AVOutputFormat h261_oformat = { +AVOutputFormat h261_muxer = { "h261", "raw h261", "video/x-h261", @@ -419,7 +501,7 @@ AVOutputFormat h261_oformat = { }; #endif //CONFIG_MUXERS -AVInputFormat h263_iformat = { +AVInputFormat h263_demuxer = { "h263", "raw h263", 0, @@ -432,7 +514,7 @@ AVInputFormat h263_iformat = { }; #ifdef CONFIG_MUXERS -AVOutputFormat h263_oformat = { +AVOutputFormat h263_muxer = { "h263", "raw h263", "video/x-h263", @@ -446,7 +528,7 @@ AVOutputFormat h263_oformat = { }; #endif //CONFIG_MUXERS -AVInputFormat m4v_iformat = { +AVInputFormat m4v_demuxer = { "m4v", "raw MPEG4 video format", 0, @@ -459,7 +541,7 @@ AVInputFormat m4v_iformat = { }; #ifdef CONFIG_MUXERS -AVOutputFormat m4v_oformat = { +AVOutputFormat m4v_muxer = { "m4v", "raw MPEG4 video format", NULL, @@ -473,7 +555,7 @@ AVOutputFormat m4v_oformat = { }; #endif //CONFIG_MUXERS -AVInputFormat h264_iformat = { +AVInputFormat h264_demuxer = { "h264", "raw H264 video format", 0, @@ -486,7 +568,7 @@ AVInputFormat h264_iformat = { }; #ifdef CONFIG_MUXERS -AVOutputFormat h264_oformat = { +AVOutputFormat h264_muxer = { "h264", "raw H264 video format", NULL, @@ -500,7 +582,7 @@ AVOutputFormat h264_oformat = { }; #endif //CONFIG_MUXERS -AVInputFormat mpegvideo_iformat = { +AVInputFormat mpegvideo_demuxer = { "mpegvideo", "MPEG video", 0, @@ -512,7 +594,7 @@ AVInputFormat mpegvideo_iformat = { }; #ifdef CONFIG_MUXERS -AVOutputFormat mpeg1video_oformat = { +AVOutputFormat mpeg1video_muxer = { "mpeg1video", "MPEG video", "video/x-mpeg", @@ -527,7 +609,7 @@ AVOutputFormat mpeg1video_oformat = { #endif //CONFIG_MUXERS #ifdef CONFIG_MUXERS -AVOutputFormat mpeg2video_oformat = { +AVOutputFormat mpeg2video_muxer = { "mpeg2video", "MPEG2 video", NULL, @@ -541,7 +623,7 @@ AVOutputFormat mpeg2video_oformat = { }; #endif //CONFIG_MUXERS -AVInputFormat mjpeg_iformat = { +AVInputFormat mjpeg_demuxer = { "mjpeg", "MJPEG video", 0, @@ -553,7 +635,7 @@ AVInputFormat mjpeg_iformat = { .value = CODEC_ID_MJPEG, }; -AVInputFormat ingenient_iformat = { +AVInputFormat ingenient_demuxer = { "ingenient", "Ingenient MJPEG", 0, @@ -566,7 +648,7 @@ AVInputFormat ingenient_iformat = { }; #ifdef CONFIG_MUXERS -AVOutputFormat mjpeg_oformat = { +AVOutputFormat mjpeg_muxer = { "mjpeg", "MJPEG video", "video/x-mjpeg", @@ -583,7 +665,7 @@ AVOutputFormat mjpeg_oformat = { /* pcm formats */ #define PCMINPUTDEF(name, long_name, ext, codec) \ -AVInputFormat pcm_ ## name ## _iformat = {\ +AVInputFormat pcm_ ## name ## _demuxer = {\ #name,\ long_name,\ 0,\ @@ -596,17 +678,8 @@ AVInputFormat pcm_ ## name ## _iformat = {\ .value = codec,\ }; -#if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS) - -#define PCMDEF(name, long_name, ext, codec) \ - PCMINPUTDEF(name, long_name, ext, codec) - -#else - -#define PCMDEF(name, long_name, ext, codec) \ - PCMINPUTDEF(name, long_name, ext, codec)\ -\ -AVOutputFormat pcm_ ## name ## _oformat = {\ +#define PCMOUTPUTDEF(name, long_name, ext, codec) \ +AVOutputFormat pcm_ ## name ## _muxer = {\ #name,\ long_name,\ NULL,\ @@ -618,7 +691,21 @@ AVOutputFormat pcm_ ## name ## _oformat = {\ raw_write_packet,\ raw_write_trailer,\ }; -#endif //CONFIG_MUXERS + + +#if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS) +#define PCMDEF(name, long_name, ext, codec) \ + PCMINPUTDEF(name, long_name, ext, codec) +#elif defined(CONFIG_MUXERS) && !defined(CONFIG_DEMUXERS) +#define PCMDEF(name, long_name, ext, codec) \ + PCMOUTPUTDEF(name, long_name, ext, codec) +#elif defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS) +#define PCMDEF(name, long_name, ext, codec) \ + PCMINPUTDEF(name, long_name, ext, codec)\ + PCMOUTPUTDEF(name, long_name, ext, codec) +#else +#define PCMDEF(name, long_name, ext, codec) +#endif #ifdef WORDS_BIGENDIAN #define BE_DEF(s) s @@ -675,7 +762,7 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) } } -AVInputFormat rawvideo_iformat = { +AVInputFormat rawvideo_demuxer = { "rawvideo", "raw video format", 0, @@ -688,7 +775,7 @@ AVInputFormat rawvideo_iformat = { }; #ifdef CONFIG_MUXERS -AVOutputFormat rawvideo_oformat = { +AVOutputFormat rawvideo_muxer = { "rawvideo", "raw video format", NULL, @@ -708,7 +795,7 @@ static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt) return 0; } -AVOutputFormat null_oformat = { +AVOutputFormat null_muxer = { "null", "null video format", NULL, @@ -726,66 +813,3 @@ AVOutputFormat null_oformat = { .flags = AVFMT_NOFILE | AVFMT_RAWPICTURE, }; #endif //CONFIG_MUXERS - -#ifndef CONFIG_MUXERS -#define av_register_output_format(format) -#endif -#ifndef CONFIG_DEMUXERS -#define av_register_input_format(format) -#endif - -int raw_init(void) -{ - - av_register_input_format(&shorten_iformat); - - av_register_input_format(&ac3_iformat); - av_register_output_format(&ac3_oformat); - - av_register_input_format(&dts_iformat); - - av_register_input_format(&h261_iformat); - av_register_output_format(&h261_oformat); - - av_register_input_format(&h263_iformat); - av_register_output_format(&h263_oformat); - - av_register_input_format(&m4v_iformat); - av_register_output_format(&m4v_oformat); - - av_register_input_format(&h264_iformat); - av_register_output_format(&h264_oformat); - - av_register_input_format(&mpegvideo_iformat); - av_register_output_format(&mpeg1video_oformat); - - av_register_output_format(&mpeg2video_oformat); - - av_register_input_format(&mjpeg_iformat); - av_register_output_format(&mjpeg_oformat); - - av_register_input_format(&ingenient_iformat); - - av_register_input_format(&pcm_s16le_iformat); - av_register_output_format(&pcm_s16le_oformat); - av_register_input_format(&pcm_s16be_iformat); - av_register_output_format(&pcm_s16be_oformat); - av_register_input_format(&pcm_u16le_iformat); - av_register_output_format(&pcm_u16le_oformat); - av_register_input_format(&pcm_u16be_iformat); - av_register_output_format(&pcm_u16be_oformat); - av_register_input_format(&pcm_s8_iformat); - av_register_output_format(&pcm_s8_oformat); - av_register_input_format(&pcm_u8_iformat); - av_register_output_format(&pcm_u8_oformat); - av_register_input_format(&pcm_mulaw_iformat); - av_register_output_format(&pcm_mulaw_oformat); - av_register_input_format(&pcm_alaw_iformat); - av_register_output_format(&pcm_alaw_oformat); - - av_register_input_format(&rawvideo_iformat); - av_register_output_format(&rawvideo_oformat); - - av_register_output_format(&null_oformat); - return 0; -}