]> git.sesse.net Git - ffmpeg/blob - libavformat/raw.c
mpeg4probe patch by (Thijs Vermeir ; thijs vermeir barco com)
[ffmpeg] / libavformat / raw.c
1 /*
2  * RAW muxer and demuxer
3  * Copyright (c) 2001 Fabrice Bellard.
4  * Copyright (c) 2005 Alex Beregszaszi
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 #include "avformat.h"
23
24 #ifdef CONFIG_MUXERS
25 /* simple formats */
26 static int raw_write_header(struct AVFormatContext *s)
27 {
28     return 0;
29 }
30
31 static int flac_write_header(struct AVFormatContext *s)
32 {
33     static const uint8_t header[8] = {
34         0x66, 0x4C, 0x61, 0x43, 0x80, 0x00, 0x00, 0x22
35     };
36     uint8_t *streaminfo = s->streams[0]->codec->extradata;
37     int len = s->streams[0]->codec->extradata_size;
38     if(streaminfo != NULL && len > 0) {
39         put_buffer(&s->pb, header, 8);
40         put_buffer(&s->pb, streaminfo, len);
41     }
42     return 0;
43 }
44
45 static int raw_write_packet(struct AVFormatContext *s, AVPacket *pkt)
46 {
47     put_buffer(&s->pb, pkt->data, pkt->size);
48     put_flush_packet(&s->pb);
49     return 0;
50 }
51
52 static int raw_write_trailer(struct AVFormatContext *s)
53 {
54     return 0;
55 }
56 #endif //CONFIG_MUXERS
57
58 /* raw input */
59 static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
60 {
61     AVStream *st;
62     int id;
63
64     st = av_new_stream(s, 0);
65     if (!st)
66         return AVERROR_NOMEM;
67
68         id = s->iformat->value;
69         if (id == CODEC_ID_RAWVIDEO) {
70             st->codec->codec_type = CODEC_TYPE_VIDEO;
71         } else {
72             st->codec->codec_type = CODEC_TYPE_AUDIO;
73         }
74         st->codec->codec_id = id;
75
76         switch(st->codec->codec_type) {
77         case CODEC_TYPE_AUDIO:
78             st->codec->sample_rate = ap->sample_rate;
79             st->codec->channels = ap->channels;
80             av_set_pts_info(st, 64, 1, st->codec->sample_rate);
81             break;
82         case CODEC_TYPE_VIDEO:
83             av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
84             st->codec->width = ap->width;
85             st->codec->height = ap->height;
86             st->codec->pix_fmt = ap->pix_fmt;
87             if(st->codec->pix_fmt == PIX_FMT_NONE)
88                 st->codec->pix_fmt= PIX_FMT_YUV420P;
89             break;
90         default:
91             return -1;
92         }
93     return 0;
94 }
95
96 #define RAW_PACKET_SIZE 1024
97
98 static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
99 {
100     int ret, size;
101     //    AVStream *st = s->streams[0];
102
103     size= RAW_PACKET_SIZE;
104
105     ret= av_get_packet(&s->pb, pkt, size);
106
107     pkt->stream_index = 0;
108     if (ret <= 0) {
109         return AVERROR_IO;
110     }
111     /* note: we need to modify the packet size here to handle the last
112        packet */
113     pkt->size = ret;
114     return ret;
115 }
116
117 static int raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
118 {
119     int ret, size;
120
121     size = RAW_PACKET_SIZE;
122
123     if (av_new_packet(pkt, size) < 0)
124         return AVERROR_IO;
125
126     pkt->pos= url_ftell(&s->pb);
127     pkt->stream_index = 0;
128     ret = get_partial_buffer(&s->pb, pkt->data, size);
129     if (ret <= 0) {
130         av_free_packet(pkt);
131         return AVERROR_IO;
132     }
133     pkt->size = ret;
134     return ret;
135 }
136
137 // http://www.artificis.hu/files/texts/ingenient.txt
138 static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt)
139 {
140     int ret, size, w, h, unk1, unk2;
141
142     if (get_le32(&s->pb) != MKTAG('M', 'J', 'P', 'G'))
143         return AVERROR_IO; // FIXME
144
145     size = get_le32(&s->pb);
146
147     w = get_le16(&s->pb);
148     h = get_le16(&s->pb);
149
150     url_fskip(&s->pb, 8); // zero + size (padded?)
151     url_fskip(&s->pb, 2);
152     unk1 = get_le16(&s->pb);
153     unk2 = get_le16(&s->pb);
154     url_fskip(&s->pb, 22); // ascii timestamp
155
156     av_log(NULL, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
157         size, w, h, unk1, unk2);
158
159     if (av_new_packet(pkt, size) < 0)
160         return AVERROR_IO;
161
162     pkt->pos = url_ftell(&s->pb);
163     pkt->stream_index = 0;
164     ret = get_buffer(&s->pb, pkt->data, size);
165     if (ret <= 0) {
166         av_free_packet(pkt);
167         return AVERROR_IO;
168     }
169     pkt->size = ret;
170     return ret;
171 }
172
173 static int raw_read_close(AVFormatContext *s)
174 {
175     return 0;
176 }
177
178 int pcm_read_seek(AVFormatContext *s,
179                   int stream_index, int64_t timestamp, int flags)
180 {
181     AVStream *st;
182     int block_align, byte_rate;
183     int64_t pos;
184
185     st = s->streams[0];
186
187     block_align = st->codec->block_align ? st->codec->block_align :
188         (av_get_bits_per_sample(st->codec->codec_id) * st->codec->channels) >> 3;
189     byte_rate = st->codec->bit_rate ? st->codec->bit_rate >> 3 :
190         block_align * st->codec->sample_rate;
191
192     if (block_align <= 0 || byte_rate <= 0)
193         return -1;
194
195     /* compute the position by aligning it to block_align */
196     pos = av_rescale_rnd(timestamp * byte_rate,
197                          st->time_base.num,
198                          st->time_base.den * (int64_t)block_align,
199                          (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
200     pos *= block_align;
201
202     /* recompute exact position */
203     st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
204     url_fseek(&s->pb, pos + s->data_offset, SEEK_SET);
205     return 0;
206 }
207
208 /* ac3 read */
209 static int ac3_read_header(AVFormatContext *s,
210                            AVFormatParameters *ap)
211 {
212     AVStream *st;
213
214     st = av_new_stream(s, 0);
215     if (!st)
216         return AVERROR_NOMEM;
217
218     st->codec->codec_type = CODEC_TYPE_AUDIO;
219     st->codec->codec_id = CODEC_ID_AC3;
220     st->need_parsing = 1;
221     /* the parameters will be extracted from the compressed bitstream */
222     return 0;
223 }
224
225 static int shorten_read_header(AVFormatContext *s,
226                                AVFormatParameters *ap)
227 {
228     AVStream *st;
229
230     st = av_new_stream(s, 0);
231     if (!st)
232         return AVERROR_NOMEM;
233     st->codec->codec_type = CODEC_TYPE_AUDIO;
234     st->codec->codec_id = CODEC_ID_SHORTEN;
235     st->need_parsing = 1;
236     /* the parameters will be extracted from the compressed bitstream */
237     return 0;
238 }
239
240 /* flac read */
241 static int flac_read_header(AVFormatContext *s,
242                             AVFormatParameters *ap)
243 {
244     AVStream *st;
245
246     st = av_new_stream(s, 0);
247     if (!st)
248         return AVERROR_NOMEM;
249     st->codec->codec_type = CODEC_TYPE_AUDIO;
250     st->codec->codec_id = CODEC_ID_FLAC;
251     st->need_parsing = 1;
252     /* the parameters will be extracted from the compressed bitstream */
253     return 0;
254 }
255
256 /* dts read */
257 static int dts_read_header(AVFormatContext *s,
258                            AVFormatParameters *ap)
259 {
260     AVStream *st;
261
262     st = av_new_stream(s, 0);
263     if (!st)
264         return AVERROR_NOMEM;
265
266     st->codec->codec_type = CODEC_TYPE_AUDIO;
267     st->codec->codec_id = CODEC_ID_DTS;
268     st->need_parsing = 1;
269     /* the parameters will be extracted from the compressed bitstream */
270     return 0;
271 }
272
273 /* aac read */
274 static int aac_read_header(AVFormatContext *s,
275                            AVFormatParameters *ap)
276 {
277     AVStream *st;
278
279     st = av_new_stream(s, 0);
280     if (!st)
281         return AVERROR_NOMEM;
282
283     st->codec->codec_type = CODEC_TYPE_AUDIO;
284     st->codec->codec_id = CODEC_ID_AAC;
285     st->need_parsing = 1;
286     /* the parameters will be extracted from the compressed bitstream */
287     return 0;
288 }
289
290 /* mpeg1/h263 input */
291 static int video_read_header(AVFormatContext *s,
292                              AVFormatParameters *ap)
293 {
294     AVStream *st;
295
296     st = av_new_stream(s, 0);
297     if (!st)
298         return AVERROR_NOMEM;
299
300     st->codec->codec_type = CODEC_TYPE_VIDEO;
301     st->codec->codec_id = s->iformat->value;
302     st->need_parsing = 1;
303
304     /* for mjpeg, specify frame rate */
305     /* for mpeg4 specify it too (most mpeg4 streams dont have the fixed_vop_rate set ...)*/
306     if (ap->time_base.num) {
307         av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
308     } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
309                 st->codec->codec_id == CODEC_ID_MPEG4 ||
310                 st->codec->codec_id == CODEC_ID_H264) {
311         av_set_pts_info(st, 64, 1, 25);
312     }
313
314     return 0;
315 }
316
317 #define SEQ_START_CODE          0x000001b3
318 #define GOP_START_CODE          0x000001b8
319 #define PICTURE_START_CODE      0x00000100
320 #define SLICE_START_CODE        0x00000101
321 #define PACK_START_CODE         0x000001ba
322 #define VIDEO_ID                0x000001e0
323 #define AUDIO_ID                0x000001c0
324
325 static int mpegvideo_probe(AVProbeData *p)
326 {
327     uint32_t code= -1;
328     int pic=0, seq=0, slice=0, pspack=0, pes=0;
329     int i;
330
331     for(i=0; i<p->buf_size; i++){
332         code = (code<<8) + p->buf[i];
333         if ((code & 0xffffff00) == 0x100) {
334             switch(code){
335             case     SEQ_START_CODE:   seq++; break;
336             case PICTURE_START_CODE:   pic++; break;
337             case   SLICE_START_CODE: slice++; break;
338             case    PACK_START_CODE: pspack++; break;
339             case           VIDEO_ID:
340             case           AUDIO_ID:   pes++; break;
341             }
342         }
343     }
344     if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
345         return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
346     return 0;
347 }
348
349 #define VIDEO_OBJECT_START_CODE        0x00000100
350 #define VIDEO_OBJECT_LAYER_START_CODE  0x00000120
351 #define VISUAL_OBJECT_START_CODE       0x000001b5
352 #define VOP_START_CODE                 0x000001b6
353
354 static int mpeg4video_probe(AVProbeData *probe_packet)
355 {
356     uint32_t temp_buffer= -1;
357     int VO=0, VOL=0, VOP = 0, VISO = 0;
358     int i;
359
360     for(i=0; i<probe_packet->buf_size; i++){
361         temp_buffer = (temp_buffer<<8) + probe_packet->buf[i];
362         if ((temp_buffer & 0xffffff00) == 0x100) {
363             switch(temp_buffer){
364             case VOP_START_CODE:             VOP++; break;
365             case VISUAL_OBJECT_START_CODE:  VISO++; break;
366             }
367             switch(temp_buffer & 0xfffffff0){
368             case VIDEO_OBJECT_START_CODE:            VO++; break;
369             case VIDEO_OBJECT_LAYER_START_CODE:     VOL++; break;
370             }
371         }
372     }
373
374     if ( VOP >= VISO && VOP >= VOL && VO >= VOL && VOL > 0)
375         return AVPROBE_SCORE_MAX/2;
376     return 0;
377 }
378
379 static int h263_probe(AVProbeData *p)
380 {
381     int code;
382     const uint8_t *d;
383
384     if (p->buf_size < 6)
385         return 0;
386     d = p->buf;
387     code = (d[0] << 14) | (d[1] << 6) | (d[2] >> 2);
388     if (code == 0x20) {
389         return 50;
390     }
391     return 0;
392 }
393
394 static int h261_probe(AVProbeData *p)
395 {
396     int code;
397     const uint8_t *d;
398
399     if (p->buf_size < 6)
400         return 0;
401     d = p->buf;
402     code = (d[0] << 12) | (d[1] << 4) | (d[2] >> 4);
403     if (code == 0x10) {
404         return 50;
405     }
406     return 0;
407 }
408
409 AVInputFormat shorten_demuxer = {
410     "shn",
411     "raw shorten",
412     0,
413     NULL,
414     shorten_read_header,
415     raw_read_partial_packet,
416     raw_read_close,
417     .extensions = "shn",
418 };
419
420 AVInputFormat flac_demuxer = {
421     "flac",
422     "raw flac",
423     0,
424     NULL,
425     flac_read_header,
426     raw_read_partial_packet,
427     raw_read_close,
428     .extensions = "flac",
429 };
430
431 #ifdef CONFIG_MUXERS
432 AVOutputFormat flac_muxer = {
433     "flac",
434     "raw flac",
435     "audio/x-flac",
436     "flac",
437     0,
438     CODEC_ID_FLAC,
439     0,
440     flac_write_header,
441     raw_write_packet,
442     raw_write_trailer,
443     .flags= AVFMT_NOTIMESTAMPS,
444 };
445 #endif //CONFIG_MUXERS
446
447 AVInputFormat ac3_demuxer = {
448     "ac3",
449     "raw ac3",
450     0,
451     NULL,
452     ac3_read_header,
453     raw_read_partial_packet,
454     raw_read_close,
455     .extensions = "ac3",
456 };
457
458 #ifdef CONFIG_MUXERS
459 AVOutputFormat ac3_muxer = {
460     "ac3",
461     "raw ac3",
462     "audio/x-ac3",
463     "ac3",
464     0,
465     CODEC_ID_AC3,
466     0,
467     raw_write_header,
468     raw_write_packet,
469     raw_write_trailer,
470     .flags= AVFMT_NOTIMESTAMPS,
471 };
472 #endif //CONFIG_MUXERS
473
474 AVInputFormat dts_demuxer = {
475     "dts",
476     "raw dts",
477     0,
478     NULL,
479     dts_read_header,
480     raw_read_partial_packet,
481     raw_read_close,
482     .extensions = "dts",
483 };
484
485 AVInputFormat aac_demuxer = {
486     "aac",
487     "ADTS AAC",
488     0,
489     NULL,
490     aac_read_header,
491     raw_read_partial_packet,
492     raw_read_close,
493     .extensions = "aac",
494 };
495
496 AVInputFormat h261_demuxer = {
497     "h261",
498     "raw h261",
499     0,
500     h261_probe,
501     video_read_header,
502     raw_read_partial_packet,
503     raw_read_close,
504     .extensions = "h261",
505     .value = CODEC_ID_H261,
506 };
507
508 #ifdef CONFIG_MUXERS
509 AVOutputFormat h261_muxer = {
510     "h261",
511     "raw h261",
512     "video/x-h261",
513     "h261",
514     0,
515     0,
516     CODEC_ID_H261,
517     raw_write_header,
518     raw_write_packet,
519     raw_write_trailer,
520     .flags= AVFMT_NOTIMESTAMPS,
521 };
522 #endif //CONFIG_MUXERS
523
524 AVInputFormat h263_demuxer = {
525     "h263",
526     "raw h263",
527     0,
528     h263_probe,
529     video_read_header,
530     raw_read_partial_packet,
531     raw_read_close,
532 //    .extensions = "h263", //FIXME remove after writing mpeg4_probe
533     .value = CODEC_ID_H263,
534 };
535
536 #ifdef CONFIG_MUXERS
537 AVOutputFormat h263_muxer = {
538     "h263",
539     "raw h263",
540     "video/x-h263",
541     "h263",
542     0,
543     0,
544     CODEC_ID_H263,
545     raw_write_header,
546     raw_write_packet,
547     raw_write_trailer,
548     .flags= AVFMT_NOTIMESTAMPS,
549 };
550 #endif //CONFIG_MUXERS
551
552 AVInputFormat m4v_demuxer = {
553     "m4v",
554     "raw MPEG4 video format",
555     0,
556     mpeg4video_probe, /** probing for mpeg4 data */
557     video_read_header,
558     raw_read_partial_packet,
559     raw_read_close,
560     .extensions = "m4v", //FIXME remove after writing mpeg4_probe
561     .value = CODEC_ID_MPEG4,
562 };
563
564 #ifdef CONFIG_MUXERS
565 AVOutputFormat m4v_muxer = {
566     "m4v",
567     "raw MPEG4 video format",
568     NULL,
569     "m4v",
570     0,
571     CODEC_ID_NONE,
572     CODEC_ID_MPEG4,
573     raw_write_header,
574     raw_write_packet,
575     raw_write_trailer,
576     .flags= AVFMT_NOTIMESTAMPS,
577 };
578 #endif //CONFIG_MUXERS
579
580 AVInputFormat h264_demuxer = {
581     "h264",
582     "raw H264 video format",
583     0,
584     NULL /*mpegvideo_probe*/,
585     video_read_header,
586     raw_read_partial_packet,
587     raw_read_close,
588     .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
589     .value = CODEC_ID_H264,
590 };
591
592 #ifdef CONFIG_MUXERS
593 AVOutputFormat h264_muxer = {
594     "h264",
595     "raw H264 video format",
596     NULL,
597     "h264",
598     0,
599     CODEC_ID_NONE,
600     CODEC_ID_H264,
601     raw_write_header,
602     raw_write_packet,
603     raw_write_trailer,
604     .flags= AVFMT_NOTIMESTAMPS,
605 };
606 #endif //CONFIG_MUXERS
607
608 AVInputFormat mpegvideo_demuxer = {
609     "mpegvideo",
610     "MPEG video",
611     0,
612     mpegvideo_probe,
613     video_read_header,
614     raw_read_partial_packet,
615     raw_read_close,
616     .value = CODEC_ID_MPEG1VIDEO,
617 };
618
619 #ifdef CONFIG_MUXERS
620 AVOutputFormat mpeg1video_muxer = {
621     "mpeg1video",
622     "MPEG video",
623     "video/x-mpeg",
624     "mpg,mpeg,m1v",
625     0,
626     0,
627     CODEC_ID_MPEG1VIDEO,
628     raw_write_header,
629     raw_write_packet,
630     raw_write_trailer,
631     .flags= AVFMT_NOTIMESTAMPS,
632 };
633 #endif //CONFIG_MUXERS
634
635 #ifdef CONFIG_MUXERS
636 AVOutputFormat mpeg2video_muxer = {
637     "mpeg2video",
638     "MPEG2 video",
639     NULL,
640     "m2v",
641     0,
642     0,
643     CODEC_ID_MPEG2VIDEO,
644     raw_write_header,
645     raw_write_packet,
646     raw_write_trailer,
647     .flags= AVFMT_NOTIMESTAMPS,
648 };
649 #endif //CONFIG_MUXERS
650
651 AVInputFormat mjpeg_demuxer = {
652     "mjpeg",
653     "MJPEG video",
654     0,
655     NULL,
656     video_read_header,
657     raw_read_partial_packet,
658     raw_read_close,
659     .extensions = "mjpg,mjpeg",
660     .value = CODEC_ID_MJPEG,
661 };
662
663 AVInputFormat ingenient_demuxer = {
664     "ingenient",
665     "Ingenient MJPEG",
666     0,
667     NULL,
668     video_read_header,
669     ingenient_read_packet,
670     raw_read_close,
671     .extensions = "cgi", // FIXME
672     .value = CODEC_ID_MJPEG,
673 };
674
675 #ifdef CONFIG_MUXERS
676 AVOutputFormat mjpeg_muxer = {
677     "mjpeg",
678     "MJPEG video",
679     "video/x-mjpeg",
680     "mjpg,mjpeg",
681     0,
682     0,
683     CODEC_ID_MJPEG,
684     raw_write_header,
685     raw_write_packet,
686     raw_write_trailer,
687     .flags= AVFMT_NOTIMESTAMPS,
688 };
689 #endif //CONFIG_MUXERS
690
691 /* pcm formats */
692
693 #define PCMINPUTDEF(name, long_name, ext, codec) \
694 AVInputFormat pcm_ ## name ## _demuxer = {\
695     #name,\
696     long_name,\
697     0,\
698     NULL,\
699     raw_read_header,\
700     raw_read_packet,\
701     raw_read_close,\
702     pcm_read_seek,\
703     .extensions = ext,\
704     .value = codec,\
705 };
706
707 #define PCMOUTPUTDEF(name, long_name, ext, codec) \
708 AVOutputFormat pcm_ ## name ## _muxer = {\
709     #name,\
710     long_name,\
711     NULL,\
712     ext,\
713     0,\
714     codec,\
715     0,\
716     raw_write_header,\
717     raw_write_packet,\
718     raw_write_trailer,\
719     .flags= AVFMT_NOTIMESTAMPS,\
720 };
721
722
723 #if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
724 #define PCMDEF(name, long_name, ext, codec) \
725         PCMINPUTDEF(name, long_name, ext, codec)
726 #elif defined(CONFIG_MUXERS) && !defined(CONFIG_DEMUXERS)
727 #define PCMDEF(name, long_name, ext, codec) \
728         PCMOUTPUTDEF(name, long_name, ext, codec)
729 #elif defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
730 #define PCMDEF(name, long_name, ext, codec) \
731         PCMINPUTDEF(name, long_name, ext, codec)\
732         PCMOUTPUTDEF(name, long_name, ext, codec)
733 #else
734 #define PCMDEF(name, long_name, ext, codec)
735 #endif
736
737 #ifdef WORDS_BIGENDIAN
738 #define BE_DEF(s) s
739 #define LE_DEF(s) NULL
740 #else
741 #define BE_DEF(s) NULL
742 #define LE_DEF(s) s
743 #endif
744
745
746 PCMDEF(s16le, "pcm signed 16 bit little endian format",
747        LE_DEF("sw"), CODEC_ID_PCM_S16LE)
748
749 PCMDEF(s16be, "pcm signed 16 bit big endian format",
750        BE_DEF("sw"), CODEC_ID_PCM_S16BE)
751
752 PCMDEF(u16le, "pcm unsigned 16 bit little endian format",
753        LE_DEF("uw"), CODEC_ID_PCM_U16LE)
754
755 PCMDEF(u16be, "pcm unsigned 16 bit big endian format",
756        BE_DEF("uw"), CODEC_ID_PCM_U16BE)
757
758 PCMDEF(s8, "pcm signed 8 bit format",
759        "sb", CODEC_ID_PCM_S8)
760
761 PCMDEF(u8, "pcm unsigned 8 bit format",
762        "ub", CODEC_ID_PCM_U8)
763
764 PCMDEF(mulaw, "pcm mu law format",
765        "ul", CODEC_ID_PCM_MULAW)
766
767 PCMDEF(alaw, "pcm A law format",
768        "al", CODEC_ID_PCM_ALAW)
769
770 static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
771 {
772     int packet_size, ret, width, height;
773     AVStream *st = s->streams[0];
774
775     width = st->codec->width;
776     height = st->codec->height;
777
778     packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);
779     if (packet_size < 0)
780         return -1;
781
782     ret= av_get_packet(&s->pb, pkt, packet_size);
783
784     pkt->stream_index = 0;
785     if (ret != packet_size) {
786         return AVERROR_IO;
787     } else {
788         return 0;
789     }
790 }
791
792 AVInputFormat rawvideo_demuxer = {
793     "rawvideo",
794     "raw video format",
795     0,
796     NULL,
797     raw_read_header,
798     rawvideo_read_packet,
799     raw_read_close,
800     .extensions = "yuv,cif,qcif",
801     .value = CODEC_ID_RAWVIDEO,
802 };
803
804 #ifdef CONFIG_MUXERS
805 AVOutputFormat rawvideo_muxer = {
806     "rawvideo",
807     "raw video format",
808     NULL,
809     "yuv",
810     0,
811     CODEC_ID_NONE,
812     CODEC_ID_RAWVIDEO,
813     raw_write_header,
814     raw_write_packet,
815     raw_write_trailer,
816     .flags= AVFMT_NOTIMESTAMPS,
817 };
818 #endif //CONFIG_MUXERS
819
820 #ifdef CONFIG_MUXERS
821 static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt)
822 {
823     return 0;
824 }
825
826 AVOutputFormat null_muxer = {
827     "null",
828     "null video format",
829     NULL,
830     NULL,
831     0,
832 #ifdef WORDS_BIGENDIAN
833     CODEC_ID_PCM_S16BE,
834 #else
835     CODEC_ID_PCM_S16LE,
836 #endif
837     CODEC_ID_RAWVIDEO,
838     raw_write_header,
839     null_write_packet,
840     raw_write_trailer,
841     .flags = AVFMT_NOFILE | AVFMT_RAWPICTURE | AVFMT_NOTIMESTAMPS,
842 };
843 #endif //CONFIG_MUXERS