]> git.sesse.net Git - ffmpeg/blob - libavformat/raw.c
TIFF decoder
[ffmpeg] / libavformat / raw.c
1 /*
2  * RAW encoder and decoder
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     switch(st->codec->codec_id) {
187     case CODEC_ID_PCM_S16LE:
188     case CODEC_ID_PCM_S16BE:
189     case CODEC_ID_PCM_U16LE:
190     case CODEC_ID_PCM_U16BE:
191         block_align = 2 * st->codec->channels;
192         byte_rate = block_align * st->codec->sample_rate;
193         break;
194     case CODEC_ID_PCM_S8:
195     case CODEC_ID_PCM_U8:
196     case CODEC_ID_PCM_MULAW:
197     case CODEC_ID_PCM_ALAW:
198         block_align = st->codec->channels;
199         byte_rate = block_align * st->codec->sample_rate;
200         break;
201     default:
202         block_align = st->codec->block_align;
203         byte_rate = st->codec->bit_rate / 8;
204         break;
205     }
206
207     if (block_align <= 0 || byte_rate <= 0)
208         return -1;
209
210     /* compute the position by aligning it to block_align */
211     pos = av_rescale_rnd(timestamp * byte_rate,
212                          st->time_base.num,
213                          st->time_base.den * (int64_t)block_align,
214                          (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
215     pos *= block_align;
216
217     /* recompute exact position */
218     st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
219     url_fseek(&s->pb, pos + s->data_offset, SEEK_SET);
220     return 0;
221 }
222
223 /* ac3 read */
224 static int ac3_read_header(AVFormatContext *s,
225                            AVFormatParameters *ap)
226 {
227     AVStream *st;
228
229     st = av_new_stream(s, 0);
230     if (!st)
231         return AVERROR_NOMEM;
232
233     st->codec->codec_type = CODEC_TYPE_AUDIO;
234     st->codec->codec_id = CODEC_ID_AC3;
235     st->need_parsing = 1;
236     /* the parameters will be extracted from the compressed bitstream */
237     return 0;
238 }
239
240 static int shorten_read_header(AVFormatContext *s,
241                                AVFormatParameters *ap)
242 {
243     AVStream *st;
244
245     st = av_new_stream(s, 0);
246     if (!st)
247         return AVERROR_NOMEM;
248     st->codec->codec_type = CODEC_TYPE_AUDIO;
249     st->codec->codec_id = CODEC_ID_SHORTEN;
250     st->need_parsing = 1;
251     /* the parameters will be extracted from the compressed bitstream */
252     return 0;
253 }
254
255 /* flac read */
256 static int flac_read_header(AVFormatContext *s,
257                             AVFormatParameters *ap)
258 {
259     AVStream *st;
260
261     st = av_new_stream(s, 0);
262     if (!st)
263         return AVERROR_NOMEM;
264     st->codec->codec_type = CODEC_TYPE_AUDIO;
265     st->codec->codec_id = CODEC_ID_FLAC;
266     st->need_parsing = 1;
267     /* the parameters will be extracted from the compressed bitstream */
268     return 0;
269 }
270
271 /* dts read */
272 static int dts_read_header(AVFormatContext *s,
273                            AVFormatParameters *ap)
274 {
275     AVStream *st;
276
277     st = av_new_stream(s, 0);
278     if (!st)
279         return AVERROR_NOMEM;
280
281     st->codec->codec_type = CODEC_TYPE_AUDIO;
282     st->codec->codec_id = CODEC_ID_DTS;
283     st->need_parsing = 1;
284     /* the parameters will be extracted from the compressed bitstream */
285     return 0;
286 }
287
288 /* aac read */
289 static int aac_read_header(AVFormatContext *s,
290                            AVFormatParameters *ap)
291 {
292     AVStream *st;
293
294     st = av_new_stream(s, 0);
295     if (!st)
296         return AVERROR_NOMEM;
297
298     st->codec->codec_type = CODEC_TYPE_AUDIO;
299     st->codec->codec_id = CODEC_ID_AAC;
300     st->need_parsing = 1;
301     /* the parameters will be extracted from the compressed bitstream */
302     return 0;
303 }
304
305 /* mpeg1/h263 input */
306 static int video_read_header(AVFormatContext *s,
307                              AVFormatParameters *ap)
308 {
309     AVStream *st;
310
311     st = av_new_stream(s, 0);
312     if (!st)
313         return AVERROR_NOMEM;
314
315     st->codec->codec_type = CODEC_TYPE_VIDEO;
316     st->codec->codec_id = s->iformat->value;
317     st->need_parsing = 1;
318
319     /* for mjpeg, specify frame rate */
320     /* for mpeg4 specify it too (most mpeg4 streams dont have the fixed_vop_rate set ...)*/
321     if (ap->time_base.num) {
322         av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
323     } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
324                 st->codec->codec_id == CODEC_ID_MPEG4 ||
325                 st->codec->codec_id == CODEC_ID_H264) {
326         av_set_pts_info(st, 64, 1, 25);
327     }
328
329     return 0;
330 }
331
332 #define SEQ_START_CODE          0x000001b3
333 #define GOP_START_CODE          0x000001b8
334 #define PICTURE_START_CODE      0x00000100
335 #define SLICE_START_CODE        0x00000101
336 #define PACK_START_CODE         0x000001ba
337 #define VIDEO_ID                0x000001e0
338 #define AUDIO_ID                0x000001c0
339
340 static int mpegvideo_probe(AVProbeData *p)
341 {
342     uint32_t code= -1;
343     int pic=0, seq=0, slice=0, pspack=0, pes=0;
344     int i;
345
346     for(i=0; i<p->buf_size; i++){
347         code = (code<<8) + p->buf[i];
348         if ((code & 0xffffff00) == 0x100) {
349             switch(code){
350             case     SEQ_START_CODE:   seq++; break;
351             case PICTURE_START_CODE:   pic++; break;
352             case   SLICE_START_CODE: slice++; break;
353             case    PACK_START_CODE: pspack++; break;
354             case           VIDEO_ID:
355             case           AUDIO_ID:   pes++; break;
356             }
357         }
358     }
359     if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
360         return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
361     return 0;
362 }
363
364 static int h263_probe(AVProbeData *p)
365 {
366     int code;
367     const uint8_t *d;
368
369     if (p->buf_size < 6)
370         return 0;
371     d = p->buf;
372     code = (d[0] << 14) | (d[1] << 6) | (d[2] >> 2);
373     if (code == 0x20) {
374         return 50;
375     }
376     return 0;
377 }
378
379 static int h261_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] << 12) | (d[1] << 4) | (d[2] >> 4);
388     if (code == 0x10) {
389         return 50;
390     }
391     return 0;
392 }
393
394 AVInputFormat shorten_demuxer = {
395     "shn",
396     "raw shorten",
397     0,
398     NULL,
399     shorten_read_header,
400     raw_read_partial_packet,
401     raw_read_close,
402     .extensions = "shn",
403 };
404
405 AVInputFormat flac_demuxer = {
406     "flac",
407     "raw flac",
408     0,
409     NULL,
410     flac_read_header,
411     raw_read_partial_packet,
412     raw_read_close,
413     .extensions = "flac",
414 };
415
416 #ifdef CONFIG_MUXERS
417 AVOutputFormat flac_muxer = {
418     "flac",
419     "raw flac",
420     "audio/x-flac",
421     "flac",
422     0,
423     CODEC_ID_FLAC,
424     0,
425     flac_write_header,
426     raw_write_packet,
427     raw_write_trailer,
428     .flags= AVFMT_NOTIMESTAMPS,
429 };
430 #endif //CONFIG_MUXERS
431
432 AVInputFormat ac3_demuxer = {
433     "ac3",
434     "raw ac3",
435     0,
436     NULL,
437     ac3_read_header,
438     raw_read_partial_packet,
439     raw_read_close,
440     .extensions = "ac3",
441 };
442
443 #ifdef CONFIG_MUXERS
444 AVOutputFormat ac3_muxer = {
445     "ac3",
446     "raw ac3",
447     "audio/x-ac3",
448     "ac3",
449     0,
450     CODEC_ID_AC3,
451     0,
452     raw_write_header,
453     raw_write_packet,
454     raw_write_trailer,
455     .flags= AVFMT_NOTIMESTAMPS,
456 };
457 #endif //CONFIG_MUXERS
458
459 AVInputFormat dts_demuxer = {
460     "dts",
461     "raw dts",
462     0,
463     NULL,
464     dts_read_header,
465     raw_read_partial_packet,
466     raw_read_close,
467     .extensions = "dts",
468 };
469
470 AVInputFormat aac_demuxer = {
471     "aac",
472     "ADTS AAC",
473     0,
474     NULL,
475     aac_read_header,
476     raw_read_partial_packet,
477     raw_read_close,
478     .extensions = "aac",
479 };
480
481 AVInputFormat h261_demuxer = {
482     "h261",
483     "raw h261",
484     0,
485     h261_probe,
486     video_read_header,
487     raw_read_partial_packet,
488     raw_read_close,
489     .extensions = "h261",
490     .value = CODEC_ID_H261,
491 };
492
493 #ifdef CONFIG_MUXERS
494 AVOutputFormat h261_muxer = {
495     "h261",
496     "raw h261",
497     "video/x-h261",
498     "h261",
499     0,
500     0,
501     CODEC_ID_H261,
502     raw_write_header,
503     raw_write_packet,
504     raw_write_trailer,
505     .flags= AVFMT_NOTIMESTAMPS,
506 };
507 #endif //CONFIG_MUXERS
508
509 AVInputFormat h263_demuxer = {
510     "h263",
511     "raw h263",
512     0,
513     h263_probe,
514     video_read_header,
515     raw_read_partial_packet,
516     raw_read_close,
517 //    .extensions = "h263", //FIXME remove after writing mpeg4_probe
518     .value = CODEC_ID_H263,
519 };
520
521 #ifdef CONFIG_MUXERS
522 AVOutputFormat h263_muxer = {
523     "h263",
524     "raw h263",
525     "video/x-h263",
526     "h263",
527     0,
528     0,
529     CODEC_ID_H263,
530     raw_write_header,
531     raw_write_packet,
532     raw_write_trailer,
533     .flags= AVFMT_NOTIMESTAMPS,
534 };
535 #endif //CONFIG_MUXERS
536
537 AVInputFormat m4v_demuxer = {
538     "m4v",
539     "raw MPEG4 video format",
540     0,
541     NULL /*mpegvideo_probe*/,
542     video_read_header,
543     raw_read_partial_packet,
544     raw_read_close,
545     .extensions = "m4v", //FIXME remove after writing mpeg4_probe
546     .value = CODEC_ID_MPEG4,
547 };
548
549 #ifdef CONFIG_MUXERS
550 AVOutputFormat m4v_muxer = {
551     "m4v",
552     "raw MPEG4 video format",
553     NULL,
554     "m4v",
555     0,
556     CODEC_ID_NONE,
557     CODEC_ID_MPEG4,
558     raw_write_header,
559     raw_write_packet,
560     raw_write_trailer,
561     .flags= AVFMT_NOTIMESTAMPS,
562 };
563 #endif //CONFIG_MUXERS
564
565 AVInputFormat h264_demuxer = {
566     "h264",
567     "raw H264 video format",
568     0,
569     NULL /*mpegvideo_probe*/,
570     video_read_header,
571     raw_read_partial_packet,
572     raw_read_close,
573     .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
574     .value = CODEC_ID_H264,
575 };
576
577 #ifdef CONFIG_MUXERS
578 AVOutputFormat h264_muxer = {
579     "h264",
580     "raw H264 video format",
581     NULL,
582     "h264",
583     0,
584     CODEC_ID_NONE,
585     CODEC_ID_H264,
586     raw_write_header,
587     raw_write_packet,
588     raw_write_trailer,
589     .flags= AVFMT_NOTIMESTAMPS,
590 };
591 #endif //CONFIG_MUXERS
592
593 AVInputFormat mpegvideo_demuxer = {
594     "mpegvideo",
595     "MPEG video",
596     0,
597     mpegvideo_probe,
598     video_read_header,
599     raw_read_partial_packet,
600     raw_read_close,
601     .value = CODEC_ID_MPEG1VIDEO,
602 };
603
604 #ifdef CONFIG_MUXERS
605 AVOutputFormat mpeg1video_muxer = {
606     "mpeg1video",
607     "MPEG video",
608     "video/x-mpeg",
609     "mpg,mpeg,m1v",
610     0,
611     0,
612     CODEC_ID_MPEG1VIDEO,
613     raw_write_header,
614     raw_write_packet,
615     raw_write_trailer,
616     .flags= AVFMT_NOTIMESTAMPS,
617 };
618 #endif //CONFIG_MUXERS
619
620 #ifdef CONFIG_MUXERS
621 AVOutputFormat mpeg2video_muxer = {
622     "mpeg2video",
623     "MPEG2 video",
624     NULL,
625     "m2v",
626     0,
627     0,
628     CODEC_ID_MPEG2VIDEO,
629     raw_write_header,
630     raw_write_packet,
631     raw_write_trailer,
632     .flags= AVFMT_NOTIMESTAMPS,
633 };
634 #endif //CONFIG_MUXERS
635
636 AVInputFormat mjpeg_demuxer = {
637     "mjpeg",
638     "MJPEG video",
639     0,
640     NULL,
641     video_read_header,
642     raw_read_partial_packet,
643     raw_read_close,
644     .extensions = "mjpg,mjpeg",
645     .value = CODEC_ID_MJPEG,
646 };
647
648 AVInputFormat ingenient_demuxer = {
649     "ingenient",
650     "Ingenient MJPEG",
651     0,
652     NULL,
653     video_read_header,
654     ingenient_read_packet,
655     raw_read_close,
656     .extensions = "cgi", // FIXME
657     .value = CODEC_ID_MJPEG,
658 };
659
660 #ifdef CONFIG_MUXERS
661 AVOutputFormat mjpeg_muxer = {
662     "mjpeg",
663     "MJPEG video",
664     "video/x-mjpeg",
665     "mjpg,mjpeg",
666     0,
667     0,
668     CODEC_ID_MJPEG,
669     raw_write_header,
670     raw_write_packet,
671     raw_write_trailer,
672     .flags= AVFMT_NOTIMESTAMPS,
673 };
674 #endif //CONFIG_MUXERS
675
676 /* pcm formats */
677
678 #define PCMINPUTDEF(name, long_name, ext, codec) \
679 AVInputFormat pcm_ ## name ## _demuxer = {\
680     #name,\
681     long_name,\
682     0,\
683     NULL,\
684     raw_read_header,\
685     raw_read_packet,\
686     raw_read_close,\
687     pcm_read_seek,\
688     .extensions = ext,\
689     .value = codec,\
690 };
691
692 #define PCMOUTPUTDEF(name, long_name, ext, codec) \
693 AVOutputFormat pcm_ ## name ## _muxer = {\
694     #name,\
695     long_name,\
696     NULL,\
697     ext,\
698     0,\
699     codec,\
700     0,\
701     raw_write_header,\
702     raw_write_packet,\
703     raw_write_trailer,\
704     .flags= AVFMT_NOTIMESTAMPS,\
705 };
706
707
708 #if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
709 #define PCMDEF(name, long_name, ext, codec) \
710         PCMINPUTDEF(name, long_name, ext, codec)
711 #elif defined(CONFIG_MUXERS) && !defined(CONFIG_DEMUXERS)
712 #define PCMDEF(name, long_name, ext, codec) \
713         PCMOUTPUTDEF(name, long_name, ext, codec)
714 #elif defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
715 #define PCMDEF(name, long_name, ext, codec) \
716         PCMINPUTDEF(name, long_name, ext, codec)\
717         PCMOUTPUTDEF(name, long_name, ext, codec)
718 #else
719 #define PCMDEF(name, long_name, ext, codec)
720 #endif
721
722 #ifdef WORDS_BIGENDIAN
723 #define BE_DEF(s) s
724 #define LE_DEF(s) NULL
725 #else
726 #define BE_DEF(s) NULL
727 #define LE_DEF(s) s
728 #endif
729
730
731 PCMDEF(s16le, "pcm signed 16 bit little endian format",
732        LE_DEF("sw"), CODEC_ID_PCM_S16LE)
733
734 PCMDEF(s16be, "pcm signed 16 bit big endian format",
735        BE_DEF("sw"), CODEC_ID_PCM_S16BE)
736
737 PCMDEF(u16le, "pcm unsigned 16 bit little endian format",
738        LE_DEF("uw"), CODEC_ID_PCM_U16LE)
739
740 PCMDEF(u16be, "pcm unsigned 16 bit big endian format",
741        BE_DEF("uw"), CODEC_ID_PCM_U16BE)
742
743 PCMDEF(s8, "pcm signed 8 bit format",
744        "sb", CODEC_ID_PCM_S8)
745
746 PCMDEF(u8, "pcm unsigned 8 bit format",
747        "ub", CODEC_ID_PCM_U8)
748
749 PCMDEF(mulaw, "pcm mu law format",
750        "ul", CODEC_ID_PCM_MULAW)
751
752 PCMDEF(alaw, "pcm A law format",
753        "al", CODEC_ID_PCM_ALAW)
754
755 static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
756 {
757     int packet_size, ret, width, height;
758     AVStream *st = s->streams[0];
759
760     width = st->codec->width;
761     height = st->codec->height;
762
763     packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);
764     if (packet_size < 0)
765         return -1;
766
767     ret= av_get_packet(&s->pb, pkt, packet_size);
768
769     pkt->stream_index = 0;
770     if (ret != packet_size) {
771         return AVERROR_IO;
772     } else {
773         return 0;
774     }
775 }
776
777 AVInputFormat rawvideo_demuxer = {
778     "rawvideo",
779     "raw video format",
780     0,
781     NULL,
782     raw_read_header,
783     rawvideo_read_packet,
784     raw_read_close,
785     .extensions = "yuv,cif,qcif",
786     .value = CODEC_ID_RAWVIDEO,
787 };
788
789 #ifdef CONFIG_MUXERS
790 AVOutputFormat rawvideo_muxer = {
791     "rawvideo",
792     "raw video format",
793     NULL,
794     "yuv",
795     0,
796     CODEC_ID_NONE,
797     CODEC_ID_RAWVIDEO,
798     raw_write_header,
799     raw_write_packet,
800     raw_write_trailer,
801     .flags= AVFMT_NOTIMESTAMPS,
802 };
803 #endif //CONFIG_MUXERS
804
805 #ifdef CONFIG_MUXERS
806 static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt)
807 {
808     return 0;
809 }
810
811 AVOutputFormat null_muxer = {
812     "null",
813     "null video format",
814     NULL,
815     NULL,
816     0,
817 #ifdef WORDS_BIGENDIAN
818     CODEC_ID_PCM_S16BE,
819 #else
820     CODEC_ID_PCM_S16LE,
821 #endif
822     CODEC_ID_RAWVIDEO,
823     raw_write_header,
824     null_write_packet,
825     raw_write_trailer,
826     .flags = AVFMT_NOFILE | AVFMT_RAWPICTURE | AVFMT_NOTIMESTAMPS,
827 };
828 #endif //CONFIG_MUXERS