Newer
Older
* RAW muxer and demuxer
* Copyright (c) 2001 Fabrice Bellard
Alex Beregszaszi
committed
* Copyright (c) 2005 Alex Beregszaszi
Diego Biurrun
committed
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
Diego Biurrun
committed
* version 2.1 of the License, or (at your option) any later version.
Diego Biurrun
committed
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
Diego Biurrun
committed
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#include "libavutil/crc.h"
#include "libavcodec/ac3_parser.h"
#include "libavcodec/bytestream.h"
#include "raw.h"
static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt)
{
return 0;
}
#endif
int ff_raw_write_packet(AVFormatContext *s, AVPacket *pkt)
put_buffer(s->pb, pkt->data, pkt->size);
put_flush_packet(s->pb);
Diego Biurrun
committed
#endif
static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
return AVERROR(ENOMEM);
id = s->iformat->value;
if (id == CODEC_ID_RAWVIDEO) {
st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
Michael Niedermayer
committed
st->codec->codec_id = id;
Michael Niedermayer
committed
switch(st->codec->codec_type) {
case AVMEDIA_TYPE_AUDIO:
Michael Niedermayer
committed
st->codec->sample_rate = ap->sample_rate;
if(ap->channels) st->codec->channels = ap->channels;
else st->codec->channels = 1;
Baptiste Coudurier
committed
st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id);
assert(st->codec->bits_per_coded_sample > 0);
st->codec->block_align = st->codec->bits_per_coded_sample*st->codec->channels/8;
Michael Niedermayer
committed
av_set_pts_info(st, 64, 1, st->codec->sample_rate);
case AVMEDIA_TYPE_VIDEO:
if(ap->time_base.num)
av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
else
av_set_pts_info(st, 64, 1, 25);
Michael Niedermayer
committed
st->codec->width = ap->width;
st->codec->height = ap->height;
st->codec->pix_fmt = ap->pix_fmt;
if(st->codec->pix_fmt == PIX_FMT_NONE)
st->codec->pix_fmt= PIX_FMT_YUV420P;
Baptiste Coudurier
committed
#define RAW_SAMPLES 1024
static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
Baptiste Coudurier
committed
size= RAW_SAMPLES*s->streams[0]->codec->block_align;
ret= av_get_packet(s->pb, pkt, size);
Reimar Döffinger
committed
if (ret < 0)
return ret;
bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id);
assert(bps); // if false there IS a bug elsewhere (NOT in this function)
pkt->dts=
pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels);
int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
Leon van Stuivenberg
committed
{
int ret, size;
size = RAW_PACKET_SIZE;
if (av_new_packet(pkt, size) < 0)
return AVERROR(ENOMEM);
pkt->pos= url_ftell(s->pb);
Leon van Stuivenberg
committed
pkt->stream_index = 0;
ret = get_partial_buffer(s->pb, pkt->data, size);
Reimar Döffinger
committed
if (ret < 0) {
Leon van Stuivenberg
committed
av_free_packet(pkt);
Reimar Döffinger
committed
return ret;
Leon van Stuivenberg
committed
}
pkt->size = ret;
return ret;
}
#endif
Leon van Stuivenberg
committed
#if CONFIG_RAWVIDEO_DEMUXER
static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
{
int packet_size, ret, width, height;
AVStream *st = s->streams[0];
width = st->codec->width;
height = st->codec->height;
packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);
if (packet_size < 0)
return -1;
ret= av_get_packet(s->pb, pkt, packet_size);
pkt->pts=
pkt->dts= pkt->pos / packet_size;
pkt->stream_index = 0;
Reimar Döffinger
committed
if (ret < 0)
return ret;
#endif
#if CONFIG_INGENIENT_DEMUXER
Alex Beregszaszi
committed
// http://www.artificis.hu/files/texts/ingenient.txt
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(EIO); // FIXME
Alex Beregszaszi
committed
size = get_le32(s->pb);
w = get_le16(s->pb);
h = get_le16(s->pb);
url_fskip(s->pb, 8); // zero + size (padded?)
url_fskip(s->pb, 2);
unk1 = get_le16(s->pb);
unk2 = get_le16(s->pb);
av_log(s, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
size, w, h, unk1, unk2);
Alex Beregszaszi
committed
if (av_new_packet(pkt, size) < 0)
return AVERROR(ENOMEM);
Alex Beregszaszi
committed
pkt->pos = url_ftell(s->pb);
Alex Beregszaszi
committed
pkt->stream_index = 0;
ret = get_buffer(s->pb, pkt->data, size);
Reimar Döffinger
committed
if (ret < 0) {
Alex Beregszaszi
committed
av_free_packet(pkt);
Reimar Döffinger
committed
return ret;
Alex Beregszaszi
committed
}
pkt->size = ret;
return ret;
}
#endif
Alex Beregszaszi
committed
int pcm_read_seek(AVFormatContext *s,
int stream_index, int64_t timestamp, int flags)
int block_align, byte_rate;
int64_t pos, ret;
block_align = st->codec->block_align ? st->codec->block_align :
(av_get_bits_per_sample(st->codec->codec_id) * st->codec->channels) >> 3;
byte_rate = st->codec->bit_rate ? st->codec->bit_rate >> 3 :
block_align * st->codec->sample_rate;
if (block_align <= 0 || byte_rate <= 0)
return -1;
Reimar Döffinger
committed
if (timestamp < 0) timestamp = 0;
/* compute the position by aligning it to block_align */
pos = av_rescale_rnd(timestamp * byte_rate,
st->time_base.num,
st->time_base.den * (int64_t)block_align,
(flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
pos *= block_align;
st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
if ((ret = url_fseek(s->pb, pos + s->data_offset, SEEK_SET)) < 0)
return ret;
static int audio_read_header(AVFormatContext *s,
AVFormatParameters *ap)
AVStream *st = av_new_stream(s, 0);
return AVERROR(ENOMEM);
st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
st->codec->codec_id = s->iformat->value;
/* the parameters will be extracted from the compressed bitstream */
static int video_read_header(AVFormatContext *s,
AVFormatParameters *ap)
{
AVStream *st;
return AVERROR(ENOMEM);
st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
Michael Niedermayer
committed
st->codec->codec_id = s->iformat->value;
/* for MJPEG, specify frame rate */
/* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/
Michael Niedermayer
committed
st->codec->time_base= ap->time_base;
} else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
Michael Niedermayer
committed
st->codec->codec_id == CODEC_ID_MPEG4 ||
st->codec->codec_id == CODEC_ID_DIRAC ||
st->codec->codec_id == CODEC_ID_DNXHD ||
st->codec->codec_id == CODEC_ID_VC1 ||
Michael Niedermayer
committed
st->codec->codec_id == CODEC_ID_H264) {
Michael Niedermayer
committed
st->codec->time_base= (AVRational){1,25};
Michael Niedermayer
committed
av_set_pts_info(st, 64, 1, 1200000);
#endif
#if CONFIG_MPEGVIDEO_DEMUXER
#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
static int mpegvideo_probe(AVProbeData *p)
{
int pic=0, seq=0, slice=0, pspack=0, pes=0;
int i;
for(i=0; i<p->buf_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;
}
if ((code & 0x1f0) == VIDEO_ID) pes++;
else if((code & 0x1e0) == AUDIO_ID) pes++;
if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
Michael Niedermayer
committed
return pic>1 ? AVPROBE_SCORE_MAX/2+1 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
#define CAVS_SEQ_START_CODE 0x000001b0
#define CAVS_PIC_I_START_CODE 0x000001b3
#define CAVS_UNDEF_START_CODE 0x000001b4
#define CAVS_PIC_PB_START_CODE 0x000001b6
#define CAVS_VIDEO_EDIT_CODE 0x000001b7
#define CAVS_PROFILE_JIZHUN 0x20
static int cavsvideo_probe(AVProbeData *p)
{
uint32_t code= -1;
int pic=0, seq=0, slice_pos = 0;
int i;
for(i=0; i<p->buf_size; i++){
code = (code<<8) + p->buf[i];
if ((code & 0xffffff00) == 0x100) {
if(code < CAVS_SEQ_START_CODE) {
/* slices have to be consecutive */
if(code < slice_pos)
return 0;
slice_pos = code;
} else {
slice_pos = 0;
}
if (code == CAVS_SEQ_START_CODE) {
seq++;
/* check for the only currently supported profile */
if(p->buf[i+1] != CAVS_PROFILE_JIZHUN)
return 0;
} else if ((code == CAVS_PIC_I_START_CODE) ||
(code == CAVS_PIC_PB_START_CODE)) {
pic++;
} else if ((code == CAVS_UNDEF_START_CODE) ||
(code > CAVS_VIDEO_EDIT_CODE)) {
return 0;
}
}
}
if(seq && seq*9<=pic*10)
return AVPROBE_SCORE_MAX/2;
return 0;
}
#endif
#if CONFIG_M4V_DEMUXER
#define VISUAL_OBJECT_START_CODE 0x000001b5
#define VOP_START_CODE 0x000001b6
static int mpeg4video_probe(AVProbeData *probe_packet)
{
uint32_t temp_buffer= -1;
Michael Niedermayer
committed
int VO=0, VOL=0, VOP = 0, VISO = 0, res=0;
int i;
for(i=0; i<probe_packet->buf_size; i++){
temp_buffer = (temp_buffer<<8) + probe_packet->buf[i];
if ((temp_buffer & 0xffffff00) != 0x100)
continue;
if (temp_buffer == VOP_START_CODE) VOP++;
else if (temp_buffer == VISUAL_OBJECT_START_CODE) VISO++;
else if (temp_buffer < 0x120) VO++;
else if (temp_buffer < 0x130) VOL++;
else if ( !(0x1AF < temp_buffer && temp_buffer < 0x1B7)
&& !(0x1B9 < temp_buffer && temp_buffer < 0x1C4)) res++;
Michael Niedermayer
committed
if ( VOP >= VISO && VOP >= VOL && VO >= VOL && VOL > 0 && res==0)
return AVPROBE_SCORE_MAX/2;
return 0;
}
#endif
#if CONFIG_H264_DEMUXER
static int h264_probe(AVProbeData *p)
{
uint32_t code= -1;
int sps=0, pps=0, idr=0, res=0, sli=0;
int i;
for(i=0; i<p->buf_size; i++){
code = (code<<8) + p->buf[i];
if ((code & 0xffffff00) == 0x100) {
int ref_idc= (code>>5)&3;
int type = code & 0x1F;
static const int8_t ref_zero[32]={
2, 0, 0, 0, 0,-1, 1,-1,
-1, 1, 1, 1, 1,-1, 2, 2,
2, 2, 2, 0, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2
};
if(code & 0x80) //forbidden bit
return 0;
if(ref_zero[type] == 1 && ref_idc)
return 0;
if(ref_zero[type] ==-1 && !ref_idc)
return 0;
if(ref_zero[type] == 2)
res++;
switch(type){
case 5: idr++; break;
case 7:
if(p->buf[i+2]&0x0F)
return 0;
sps++;
break;
case 8: pps++; break;
}
}
}
if(sps && pps && (idr||sli>3) && res<(sps+pps+idr))
return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
return 0;
}
#endif
#if CONFIG_H263_DEMUXER
static int h263_probe(AVProbeData *p)
{
uint64_t code= -1;
int i;
int valid_psc=0;
int invalid_psc=0;
int res_change=0;
int src_fmt, last_src_fmt=-1;
for(i=0; i<p->buf_size; i++){
code = (code<<8) + p->buf[i];
if ((code & 0xfffffc0000) == 0x800000) {
src_fmt= (code>>2)&3;
if( src_fmt != last_src_fmt
&& last_src_fmt>0 && last_src_fmt<6
&& src_fmt<6)
res_change++;
if((code&0x300)==0x200 && src_fmt){
valid_psc++;
}else
invalid_psc++;
last_src_fmt= src_fmt;
} else if((code & 0xffff800000) == 0x800000) {
int gn= (code>>(23-5)) & 0x1F;
if(gn<last_gn){
invalid_psc++;
}else
last_gn= gn;
//av_log(NULL, AV_LOG_ERROR, "h263_probe: psc:%d invalid:%d res_change:%d\n", valid_psc, invalid_psc, res_change);
//h263_probe: psc:3 invalid:0 res_change:0 (1588/recent_ffmpeg_parses_mpg_incorrectly.mpg)
if(valid_psc > 2*invalid_psc + 2*res_change + 3){
return 50;
}else if(valid_psc > 2*invalid_psc)
return 25;
return 0;
}
#endif
#if CONFIG_H261_DEMUXER
Michael Niedermayer
committed
static int h261_probe(AVProbeData *p)
{
uint32_t code= -1;
int i;
int valid_psc=0;
int invalid_psc=0;
int next_gn=0;
int src_fmt=0;
GetBitContext gb;
init_get_bits(&gb, p->buf, p->buf_size*8);
for(i=0; i<p->buf_size*8; i++){
if ((code & 0x01ff0000) || !(code & 0xff00)) {
code = (code<<8) + get_bits(&gb, 8);
i += 7;
} else
if ((code & 0xffff0000) == 0x10000) {
int gn= (code>>12)&0xf;
if(!gn)
src_fmt= code&8;
if(gn != next_gn) invalid_psc++;
else valid_psc++;
if(src_fmt){ // CIF
next_gn= (gn+1 )%13;
}else{ //QCIF
next_gn= (gn+1+!!gn)% 7;
}
}
Michael Niedermayer
committed
}
Michael Niedermayer
committed
if(valid_psc > 2*invalid_psc + 6){
return 50;
}else if(valid_psc > 2*invalid_psc + 2)
return 25;
Michael Niedermayer
committed
return 0;
}
#endif
Michael Niedermayer
committed
#if CONFIG_DTS_DEMUXER
#define DCA_MARKER_14B_BE 0x1FFFE800
#define DCA_MARKER_14B_LE 0xFF1F00E8
#define DCA_MARKER_RAW_BE 0x7FFE8001
#define DCA_MARKER_RAW_LE 0xFE7F0180
static int dts_probe(AVProbeData *p)
{
const uint8_t *buf, *bufp;
uint32_t state = -1;
Reimar Döffinger
committed
int markers[3] = {0};
int sum, max;
buf = p->buf;
for(; buf < (p->buf+p->buf_size)-2; buf+=2) {
bufp = buf;
state = (state << 16) | bytestream_get_be16(&bufp);
if (state == DCA_MARKER_RAW_BE || state == DCA_MARKER_RAW_LE)
Reimar Döffinger
committed
markers[0]++;
if (state == DCA_MARKER_14B_BE)
if ((bytestream_get_be16(&bufp) & 0xFFF0) == 0x07F0)
Reimar Döffinger
committed
markers[1]++;
if (state == DCA_MARKER_14B_LE)
if ((bytestream_get_be16(&bufp) & 0xF0FF) == 0xF007)
Reimar Döffinger
committed
markers[2]++;
Reimar Döffinger
committed
sum = markers[0] + markers[1] + markers[2];
max = markers[1] > markers[0];
max = markers[2] > markers[max] ? 2 : max;
if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 &&
markers[max] * 4 > sum * 3)
return AVPROBE_SCORE_MAX/2+1;
#endif
#if CONFIG_DIRAC_DEMUXER
static int dirac_probe(AVProbeData *p)
{
if (AV_RL32(p->buf) == MKTAG('B', 'B', 'C', 'D'))
return AVPROBE_SCORE_MAX;
else
return 0;
}
#endif
#if CONFIG_DNXHD_DEMUXER
static int dnxhd_probe(AVProbeData *p)
{
static const uint8_t header[] = {0x00,0x00,0x02,0x80,0x01};
Reimar Döffinger
committed
int w, h, compression_id;
if (p->buf_size < 0x2c)
return 0;
if (memcmp(p->buf, header, 5))
return 0;
h = AV_RB16(p->buf + 0x18);
w = AV_RB16(p->buf + 0x1a);
if (!w || !h)
return 0;
compression_id = AV_RB32(p->buf + 0x28);
if (compression_id < 1237 || compression_id > 1253)
Reimar Döffinger
committed
return AVPROBE_SCORE_MAX;
#if CONFIG_AC3_DEMUXER || CONFIG_EAC3_DEMUXER
static int ac3_eac3_probe(AVProbeData *p, enum CodecID expected_codec_id)
int max_frames, first_frames = 0, frames;
uint8_t *buf, *buf2, *end;
AC3HeaderInfo hdr;
Bartlomiej Wolowiec
committed
GetBitContext gbc;
enum CodecID codec_id = CODEC_ID_AC3;
max_frames = 0;
buf = p->buf;
Justin Ruggles
committed
end = buf + p->buf_size;
for(; buf < end; buf++) {
buf2 = buf;
for(frames = 0; buf2 < end; frames++) {
Bartlomiej Wolowiec
committed
init_get_bits(&gbc, buf2, 54);
if(ff_ac3_parse_header(&gbc, &hdr) < 0)
if(buf2 + hdr.frame_size > end ||
av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2))
break;
codec_id = CODEC_ID_EAC3;
buf2 += hdr.frame_size;
}
max_frames = FFMAX(max_frames, frames);
if(buf == p->buf)
first_frames = frames;
}
if(codec_id != expected_codec_id) return 0;
Reimar Döffinger
committed
// keep this in sync with mp3 probe, both need to avoid
// issues with MPEG-files!
if (first_frames>=4) return AVPROBE_SCORE_MAX/2+1;
else if(max_frames>500)return AVPROBE_SCORE_MAX/2;
else if(max_frames>=4) return AVPROBE_SCORE_MAX/4;
else if(max_frames>=1) return 1;
else return 0;
#endif
#if CONFIG_AC3_DEMUXER
static int ac3_probe(AVProbeData *p)
{
return ac3_eac3_probe(p, CODEC_ID_AC3);
#if CONFIG_EAC3_DEMUXER
static int eac3_probe(AVProbeData *p)
{
return ac3_eac3_probe(p, CODEC_ID_EAC3);
/* Note: Do not forget to add new entries to the Makefile as well. */
#if CONFIG_AC3_DEMUXER
AVInputFormat ac3_demuxer = {
NULL_IF_CONFIG_SMALL("raw AC-3"),
audio_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
Måns Rullgård
committed
.extensions = "ac3",
.value = CODEC_ID_AC3,
AVOutputFormat ac3_muxer = {
NULL_IF_CONFIG_SMALL("raw AC-3"),
Michael Niedermayer
committed
.flags= AVFMT_NOTIMESTAMPS,
Diego Biurrun
committed
#endif
#if CONFIG_DIRAC_DEMUXER
AVInputFormat dirac_demuxer = {
"dirac",
NULL_IF_CONFIG_SMALL("raw Dirac"),
0,
dirac_probe,
video_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.value = CODEC_ID_DIRAC,
};
#endif
#if CONFIG_DIRAC_MUXER
AVOutputFormat dirac_muxer = {
"dirac",
NULL_IF_CONFIG_SMALL("raw Dirac"),
NULL,
"drc",
0,
CODEC_ID_DIRAC,
NULL,
.flags= AVFMT_NOTIMESTAMPS,
};
#endif
#if CONFIG_DNXHD_DEMUXER
AVInputFormat dnxhd_demuxer = {
"dnxhd",
NULL_IF_CONFIG_SMALL("raw DNxHD (SMPTE VC-3)"),
0,
dnxhd_probe,
video_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.value = CODEC_ID_DNXHD,
};
#endif
#if CONFIG_DNXHD_MUXER
AVOutputFormat dnxhd_muxer = {
"dnxhd",
NULL_IF_CONFIG_SMALL("raw DNxHD (SMPTE VC-3)"),
NULL,
"dnxhd",
0,
CODEC_ID_NONE,
CODEC_ID_DNXHD,
NULL,
.flags= AVFMT_NOTIMESTAMPS,
};
#endif
#if CONFIG_DTS_DEMUXER
AVInputFormat dts_demuxer = {
"dts",
NULL_IF_CONFIG_SMALL("raw DTS"),
audio_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "dts",
.value = CODEC_ID_DTS,
#endif
AVOutputFormat dts_muxer = {
"dts",
NULL_IF_CONFIG_SMALL("raw DTS"),
"audio/x-dca",
"dts",
CODEC_ID_DTS,
CODEC_ID_NONE,
.flags= AVFMT_NOTIMESTAMPS,
};
#endif
#if CONFIG_EAC3_DEMUXER
AVInputFormat eac3_demuxer = {
"eac3",
NULL_IF_CONFIG_SMALL("raw E-AC-3"),
0,
eac3_probe,
audio_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "eac3",
.value = CODEC_ID_EAC3,
};
#endif
AVOutputFormat eac3_muxer = {
"eac3",
NULL_IF_CONFIG_SMALL("raw E-AC-3"),
"audio/x-eac3",
"eac3",
0,
CODEC_ID_EAC3,
CODEC_ID_NONE,
NULL,
.flags= AVFMT_NOTIMESTAMPS,
};
#endif
#if CONFIG_GSM_DEMUXER
AVInputFormat gsm_demuxer = {
"gsm",
0,
NULL,
audio_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "gsm",
.value = CODEC_ID_GSM,
};
#endif
#if CONFIG_H261_DEMUXER
AVInputFormat h261_demuxer = {
Michael Niedermayer
committed
"h261",
NULL_IF_CONFIG_SMALL("raw H.261"),
Michael Niedermayer
committed
0,
h261_probe,
video_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
Michael Niedermayer
committed
.extensions = "h261",
.value = CODEC_ID_H261,
};
#endif
Michael Niedermayer
committed
AVOutputFormat h261_muxer = {
Michael Niedermayer
committed
"h261",
NULL_IF_CONFIG_SMALL("raw H.261"),
Michael Niedermayer
committed
"video/x-h261",
"h261",
0,
Michael Niedermayer
committed
CODEC_ID_H261,
Michael Niedermayer
committed
.flags= AVFMT_NOTIMESTAMPS,
Michael Niedermayer
committed
};
Diego Biurrun
committed
#endif
Michael Niedermayer
committed
#if CONFIG_H263_DEMUXER
AVInputFormat h263_demuxer = {
NULL_IF_CONFIG_SMALL("raw H.263"),
0,
h263_probe,
video_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
// .extensions = "h263", //FIXME remove after writing mpeg4_probe
.value = CODEC_ID_H263,
};
#endif
AVOutputFormat h263_muxer = {
NULL_IF_CONFIG_SMALL("raw H.263"),
Michael Niedermayer
committed
.flags= AVFMT_NOTIMESTAMPS,
Diego Biurrun
committed
#endif
#if CONFIG_H264_DEMUXER
AVInputFormat h264_demuxer = {
"h264",
NULL_IF_CONFIG_SMALL("raw H.264 video format"),
0,
video_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
.value = CODEC_ID_H264,
};
#endif
AVOutputFormat h264_muxer = {
"h264",
NULL_IF_CONFIG_SMALL("raw H.264 video format"),
NULL,
"h264",
0,
CODEC_ID_NONE,
CODEC_ID_H264,
NULL,
.flags= AVFMT_NOTIMESTAMPS,
};
Diego Biurrun
committed
#endif
#if CONFIG_CAVSVIDEO_MUXER
AVOutputFormat cavsvideo_muxer = {
"cavsvideo",
NULL_IF_CONFIG_SMALL("raw Chinese AVS video"),
NULL,
"cavs",
0,
CODEC_ID_NONE,
CODEC_ID_CAVS,
NULL,
.flags= AVFMT_NOTIMESTAMPS,
};
#endif
#if CONFIG_INGENIENT_DEMUXER
AVInputFormat ingenient_demuxer = {
"ingenient",
NULL_IF_CONFIG_SMALL("raw Ingenient MJPEG"),
0,
NULL,
video_read_header,
ingenient_read_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "cgi", // FIXME
.value = CODEC_ID_MJPEG,
};
#endif
#if CONFIG_M4V_DEMUXER
AVInputFormat m4v_demuxer = {
NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
mpeg4video_probe, /** probing for MPEG-4 data */
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
Måns Rullgård
committed
.value = CODEC_ID_MPEG4,
#endif
AVOutputFormat m4v_muxer = {
Max Krasnyansky
committed
"m4v",
NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
Max Krasnyansky
committed
NULL,
"m4v",
0,
CODEC_ID_NONE,
CODEC_ID_MPEG4,
Michael Niedermayer
committed
.flags= AVFMT_NOTIMESTAMPS,
Max Krasnyansky
committed
};
Diego Biurrun
committed
#endif
Max Krasnyansky
committed
#if CONFIG_MJPEG_DEMUXER
AVInputFormat mjpeg_demuxer = {
"mjpeg",
NULL_IF_CONFIG_SMALL("raw MJPEG video"),
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "mjpg,mjpeg",
.value = CODEC_ID_MJPEG,
#endif
#if CONFIG_MJPEG_MUXER
AVOutputFormat mjpeg_muxer = {
"mjpeg",
NULL_IF_CONFIG_SMALL("raw MJPEG video"),
"video/x-mjpeg",
"mjpg,mjpeg",
CODEC_ID_MJPEG,
Michael Niedermayer
committed
.flags= AVFMT_NOTIMESTAMPS,
Diego Biurrun
committed
#endif
#if CONFIG_MLP_DEMUXER
AVInputFormat mlp_demuxer = {
"mlp",
NULL_IF_CONFIG_SMALL("raw MLP"),
NULL,
audio_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "mlp",
.value = CODEC_ID_MLP,
#endif