| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /* 
 | 
					
						
							|  |  |  |  * RAW encoder and decoder | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * Copyright (c) 2001 Fabrice Bellard. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * This library 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 | 
					
						
							|  |  |  |  * version 2 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | #include "avformat.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* simple formats */ | 
					
						
							| 
									
										
										
										
											2003-02-10 09:35:32 +00:00
										 |  |  | static int raw_write_header(struct AVFormatContext *s) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-10 09:35:32 +00:00
										 |  |  | static int raw_write_packet(struct AVFormatContext *s, int stream_index, | 
					
						
							|  |  |  | 			    unsigned char *buf, int size, int force_pts) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     put_buffer(&s->pb, buf, size); | 
					
						
							|  |  |  |     put_flush_packet(&s->pb); | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-10 09:35:32 +00:00
										 |  |  | static int raw_write_trailer(struct AVFormatContext *s) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* raw input */ | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  | static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     AVStream *st; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     int id; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     st = av_new_stream(s, 0); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (!st) | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |         return AVERROR_NOMEM; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (ap) { | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |         id = s->iformat->value; | 
					
						
							|  |  |  |         if (id == CODEC_ID_RAWVIDEO) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             st->codec.codec_type = CODEC_TYPE_VIDEO; | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |             st->codec.codec_type = CODEC_TYPE_AUDIO; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |         st->codec.codec_id = id; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         switch(st->codec.codec_type) { | 
					
						
							|  |  |  |         case CODEC_TYPE_AUDIO: | 
					
						
							|  |  |  |             st->codec.sample_rate = ap->sample_rate; | 
					
						
							|  |  |  |             st->codec.channels = ap->channels; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case CODEC_TYPE_VIDEO: | 
					
						
							| 
									
										
										
										
											2003-03-12 15:16:19 +00:00
										 |  |  |             st->codec.frame_rate      = ap->frame_rate; | 
					
						
							|  |  |  |             st->codec.frame_rate_base = ap->frame_rate_base; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             st->codec.width = ap->width; | 
					
						
							|  |  |  |             st->codec.height = ap->height; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |             return -1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-15 22:44:44 +00:00
										 |  |  | #define RAW_PACKET_SIZE 1024
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-10 09:35:32 +00:00
										 |  |  | static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  |     int ret, size; | 
					
						
							| 
									
										
										
										
											2003-01-23 09:52:30 +00:00
										 |  |  |     //    AVStream *st = s->streams[0];
 | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2002-11-18 17:33:03 +00:00
										 |  |  |     size= RAW_PACKET_SIZE; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  |     if (av_new_packet(pkt, size) < 0) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         return -EIO; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pkt->stream_index = 0; | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  |     ret = get_buffer(&s->pb, pkt->data, size); | 
					
						
							| 
									
										
										
										
											2001-09-15 22:44:44 +00:00
										 |  |  |     if (ret <= 0) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         av_free_packet(pkt); | 
					
						
							| 
									
										
										
										
											2001-09-15 22:44:44 +00:00
										 |  |  |         return -EIO; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* note: we need to modify the packet size here to handle the last
 | 
					
						
							|  |  |  |        packet */ | 
					
						
							|  |  |  |     pkt->size = ret; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-10 09:35:32 +00:00
										 |  |  | static int raw_read_close(AVFormatContext *s) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* mp3 read */ | 
					
						
							|  |  |  | static int mp3_read_header(AVFormatContext *s, | 
					
						
							|  |  |  |                            AVFormatParameters *ap) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     AVStream *st; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     st = av_new_stream(s, 0); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (!st) | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |         return AVERROR_NOMEM; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     st->codec.codec_type = CODEC_TYPE_AUDIO; | 
					
						
							|  |  |  |     st->codec.codec_id = CODEC_ID_MP2; | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |     /* the parameters will be extracted from the compressed bitstream */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-09 18:07:16 +00:00
										 |  |  | /* ac3 read */ | 
					
						
							|  |  |  | static int ac3_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_AC3; | 
					
						
							|  |  |  |     /* the parameters will be extracted from the compressed bitstream */ | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /* mpeg1/h263 input */ | 
					
						
							|  |  |  | static int video_read_header(AVFormatContext *s, | 
					
						
							|  |  |  |                              AVFormatParameters *ap) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     AVStream *st; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     st = av_new_stream(s, 0); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (!st) | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |         return AVERROR_NOMEM; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     st->codec.codec_type = CODEC_TYPE_VIDEO; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     st->codec.codec_id = s->iformat->value; | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |     /* for mjpeg, specify frame rate */ | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  |     /* for mpeg4 specify it too (most mpeg4 streams dont have the fixed_vop_rate set ...)*/ | 
					
						
							|  |  |  |     if (st->codec.codec_id == CODEC_ID_MJPEG || st->codec.codec_id == CODEC_ID_MPEG4) { | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |         if (ap) { | 
					
						
							| 
									
										
										
										
											2003-03-12 15:16:19 +00:00
										 |  |  |             st->codec.frame_rate      = ap->frame_rate; | 
					
						
							|  |  |  |             st->codec.frame_rate_base = ap->frame_rate_base; | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2003-03-12 15:16:19 +00:00
										 |  |  |             st->codec.frame_rate      = 25; | 
					
						
							|  |  |  |             st->codec.frame_rate_base = 1; | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | #define SEQ_START_CODE		0x000001b3
 | 
					
						
							|  |  |  | #define GOP_START_CODE		0x000001b8
 | 
					
						
							|  |  |  | #define PICTURE_START_CODE	0x00000100
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* XXX: improve that by looking at several start codes */ | 
					
						
							|  |  |  | static int mpegvideo_probe(AVProbeData *p) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2003-02-02 20:04:03 +00:00
										 |  |  |     int code; | 
					
						
							|  |  |  |     const uint8_t *d; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* 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 */ | 
					
						
							| 
									
										
										
										
											2003-02-02 20:04:03 +00:00
										 |  |  |     /* 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; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVInputFormat mp3_iformat = { | 
					
						
							|  |  |  |     "mp3", | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     "MPEG audio", | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     0, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     mp3_read_header, | 
					
						
							|  |  |  |     raw_read_packet, | 
					
						
							|  |  |  |     raw_read_close, | 
					
						
							| 
									
										
										
										
											2002-10-06 23:06:06 +00:00
										 |  |  |     .extensions = "mp2,mp3", /* XXX: use probe */ | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVOutputFormat mp2_oformat = { | 
					
						
							|  |  |  |     "mp2", | 
					
						
							|  |  |  |     "MPEG audio layer 2", | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     "audio/x-mpeg", | 
					
						
							|  |  |  |     "mp2,mp3", | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     0, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     CODEC_ID_MP2, | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     raw_write_header, | 
					
						
							|  |  |  |     raw_write_packet, | 
					
						
							|  |  |  |     raw_write_trailer, | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | AVInputFormat ac3_iformat = { | 
					
						
							|  |  |  |     "ac3", | 
					
						
							|  |  |  |     "raw ac3", | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     NULL, | 
					
						
							| 
									
										
										
										
											2003-02-09 18:07:16 +00:00
										 |  |  |     ac3_read_header, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     raw_read_packet, | 
					
						
							|  |  |  |     raw_read_close, | 
					
						
							| 
									
										
										
										
											2002-10-06 23:06:06 +00:00
										 |  |  |     .extensions = "ac3", | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | AVOutputFormat ac3_oformat = { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     "ac3", | 
					
						
							|  |  |  |     "raw ac3", | 
					
						
							|  |  |  |     "audio/x-ac3",  | 
					
						
							|  |  |  |     "ac3", | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     0, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     CODEC_ID_AC3, | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     raw_write_header, | 
					
						
							|  |  |  |     raw_write_packet, | 
					
						
							|  |  |  |     raw_write_trailer, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | AVOutputFormat h263_oformat = { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     "h263", | 
					
						
							|  |  |  |     "raw h263", | 
					
						
							|  |  |  |     "video/x-h263", | 
					
						
							|  |  |  |     "h263", | 
					
						
							|  |  |  |     0, | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     0, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     CODEC_ID_H263, | 
					
						
							|  |  |  |     raw_write_header, | 
					
						
							|  |  |  |     raw_write_packet, | 
					
						
							|  |  |  |     raw_write_trailer, | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  | AVInputFormat m4v_iformat = { | 
					
						
							|  |  |  |     "m4v", | 
					
						
							|  |  |  |     "raw MPEG4 video format", | 
					
						
							|  |  |  |     0, | 
					
						
							| 
									
										
										
										
											2002-09-12 12:46:34 +00:00
										 |  |  |     NULL /*mpegvideo_probe*/, | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  |     video_read_header, | 
					
						
							|  |  |  |     raw_read_packet, | 
					
						
							|  |  |  |     raw_read_close, | 
					
						
							| 
									
										
										
										
											2002-10-06 23:06:06 +00:00
										 |  |  |     .extensions = "m4v", //FIXME remove after writing mpeg4_probe
 | 
					
						
							|  |  |  |     .value = CODEC_ID_MPEG4, | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-11 18:46:47 +00:00
										 |  |  | AVOutputFormat m4v_oformat = { | 
					
						
							|  |  |  |     "m4v", | 
					
						
							|  |  |  |     "raw MPEG4 video format", | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     "m4v", | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     CODEC_ID_NONE, | 
					
						
							|  |  |  |     CODEC_ID_MPEG4, | 
					
						
							|  |  |  |     raw_write_header, | 
					
						
							|  |  |  |     raw_write_packet, | 
					
						
							|  |  |  |     raw_write_trailer, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | AVInputFormat mpegvideo_iformat = { | 
					
						
							|  |  |  |     "mpegvideo", | 
					
						
							|  |  |  |     "MPEG video", | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     mpegvideo_probe, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     video_read_header, | 
					
						
							|  |  |  |     raw_read_packet, | 
					
						
							|  |  |  |     raw_read_close, | 
					
						
							| 
									
										
										
										
											2002-10-06 23:06:06 +00:00
										 |  |  |     .value = CODEC_ID_MPEG1VIDEO, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | AVOutputFormat mpeg1video_oformat = { | 
					
						
							|  |  |  |     "mpeg1video", | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     "MPEG video", | 
					
						
							|  |  |  |     "video/x-mpeg", | 
					
						
							|  |  |  |     "mpg,mpeg", | 
					
						
							|  |  |  |     0, | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     0, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     CODEC_ID_MPEG1VIDEO, | 
					
						
							|  |  |  |     raw_write_header, | 
					
						
							|  |  |  |     raw_write_packet, | 
					
						
							|  |  |  |     raw_write_trailer, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | AVInputFormat mjpeg_iformat = { | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |     "mjpeg", | 
					
						
							|  |  |  |     "MJPEG video", | 
					
						
							|  |  |  |     0, | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     NULL, | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  |     video_read_header, | 
					
						
							|  |  |  |     raw_read_packet, | 
					
						
							|  |  |  |     raw_read_close, | 
					
						
							| 
									
										
										
										
											2002-10-06 23:06:06 +00:00
										 |  |  |     .extensions = "mjpg,mjpeg", | 
					
						
							|  |  |  |     .value = CODEC_ID_MJPEG, | 
					
						
							| 
									
										
										
										
											2001-08-15 13:06:33 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | AVOutputFormat mjpeg_oformat = { | 
					
						
							|  |  |  |     "mjpeg", | 
					
						
							|  |  |  |     "MJPEG video", | 
					
						
							|  |  |  |     "video/x-mjpeg", | 
					
						
							|  |  |  |     "mjpg,mjpeg", | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  |     0, | 
					
						
							|  |  |  |     0, | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     CODEC_ID_MJPEG, | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  |     raw_write_header, | 
					
						
							|  |  |  |     raw_write_packet, | 
					
						
							|  |  |  |     raw_write_trailer, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | /* pcm formats */ | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | #define PCMDEF(name, long_name, ext, codec) \
 | 
					
						
							|  |  |  | AVInputFormat pcm_ ## name ## _iformat = {\ | 
					
						
							|  |  |  |     #name,\
 | 
					
						
							|  |  |  |     long_name,\ | 
					
						
							|  |  |  |     0,\ | 
					
						
							|  |  |  |     NULL,\ | 
					
						
							|  |  |  |     raw_read_header,\ | 
					
						
							|  |  |  |     raw_read_packet,\ | 
					
						
							|  |  |  |     raw_read_close,\ | 
					
						
							| 
									
										
										
										
											2002-10-06 23:06:06 +00:00
										 |  |  |     .extensions = ext,\ | 
					
						
							|  |  |  |     .value = codec,\ | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | };\ | 
					
						
							|  |  |  | \ | 
					
						
							|  |  |  | AVOutputFormat pcm_ ## name ## _oformat = {\ | 
					
						
							|  |  |  |     #name,\
 | 
					
						
							|  |  |  |     long_name,\ | 
					
						
							|  |  |  |     NULL,\ | 
					
						
							|  |  |  |     ext,\ | 
					
						
							|  |  |  |     0,\ | 
					
						
							|  |  |  |     codec,\ | 
					
						
							|  |  |  |     0,\ | 
					
						
							|  |  |  |     raw_write_header,\ | 
					
						
							|  |  |  |     raw_write_packet,\ | 
					
						
							|  |  |  |     raw_write_trailer,\ | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef WORDS_BIGENDIAN
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | #define BE_DEF(s) s
 | 
					
						
							|  |  |  | #define LE_DEF(s) NULL
 | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | #define BE_DEF(s) NULL
 | 
					
						
							|  |  |  | #define LE_DEF(s) s
 | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | PCMDEF(s16le, "pcm signed 16 bit little endian format",  | 
					
						
							|  |  |  |        LE_DEF("sw"), CODEC_ID_PCM_S16LE) | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | PCMDEF(s16be, "pcm signed 16 bit big endian format",  | 
					
						
							|  |  |  |        BE_DEF("sw"), CODEC_ID_PCM_S16BE) | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | PCMDEF(u16le, "pcm unsigned 16 bit little endian format",  | 
					
						
							|  |  |  |        LE_DEF("uw"), CODEC_ID_PCM_U16LE) | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | PCMDEF(u16be, "pcm unsigned 16 bit big endian format",  | 
					
						
							|  |  |  |        BE_DEF("uw"), CODEC_ID_PCM_U16BE) | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | PCMDEF(s8, "pcm signed 8 bit format",  | 
					
						
							|  |  |  |        "sb", CODEC_ID_PCM_S8) | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | PCMDEF(u8, "pcm unsigned 8 bit format",  | 
					
						
							|  |  |  |        "ub", CODEC_ID_PCM_U8) | 
					
						
							| 
									
										
										
										
											2001-09-23 17:19:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | PCMDEF(mulaw, "pcm mu law format",  | 
					
						
							|  |  |  |        "ul", CODEC_ID_PCM_MULAW) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | PCMDEF(alaw, "pcm A law format",  | 
					
						
							|  |  |  |        "al", CODEC_ID_PCM_ALAW) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-10 09:35:32 +00:00
										 |  |  | static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int packet_size, ret, width, height; | 
					
						
							|  |  |  |     AVStream *st = s->streams[0]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     width = st->codec.width; | 
					
						
							|  |  |  |     height = st->codec.height; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch(st->codec.pix_fmt) { | 
					
						
							|  |  |  |     case PIX_FMT_YUV420P: | 
					
						
							|  |  |  |         packet_size = (width * height * 3) / 2; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case PIX_FMT_YUV422: | 
					
						
							|  |  |  |         packet_size = (width * height * 2); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case PIX_FMT_BGR24: | 
					
						
							|  |  |  |     case PIX_FMT_RGB24: | 
					
						
							|  |  |  |         packet_size = (width * height * 3); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     default: | 
					
						
							| 
									
										
										
										
											2002-09-12 02:34:01 +00:00
										 |  |  |         av_abort(); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (av_new_packet(pkt, packet_size) < 0) | 
					
						
							|  |  |  |         return -EIO; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pkt->stream_index = 0; | 
					
						
							| 
									
										
										
										
											2002-09-11 17:04:04 +00:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     /* bypass buffered I/O */ | 
					
						
							|  |  |  |     ret = url_read(url_fileno(&s->pb), pkt->data, pkt->size); | 
					
						
							| 
									
										
										
										
											2002-09-11 17:04:04 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |     ret = get_buffer(&s->pb, pkt->data, pkt->size); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (ret != pkt->size) { | 
					
						
							|  |  |  |         av_free_packet(pkt); | 
					
						
							|  |  |  |         return -EIO; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | AVInputFormat rawvideo_iformat = { | 
					
						
							|  |  |  |     "rawvideo", | 
					
						
							|  |  |  |     "raw video format", | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     raw_read_header, | 
					
						
							|  |  |  |     rawvideo_read_packet, | 
					
						
							|  |  |  |     raw_read_close, | 
					
						
							| 
									
										
										
										
											2002-10-06 23:06:06 +00:00
										 |  |  |     .extensions = "yuv", | 
					
						
							|  |  |  |     .value = CODEC_ID_RAWVIDEO, | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVOutputFormat rawvideo_oformat = { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     "rawvideo", | 
					
						
							|  |  |  |     "raw video format", | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     "yuv", | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     0, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     CODEC_ID_NONE, | 
					
						
							|  |  |  |     CODEC_ID_RAWVIDEO, | 
					
						
							|  |  |  |     raw_write_header, | 
					
						
							|  |  |  |     raw_write_packet, | 
					
						
							|  |  |  |     raw_write_trailer, | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-14 17:55:34 +00:00
										 |  |  | static int null_write_packet(struct AVFormatContext *s,  | 
					
						
							|  |  |  |                              int stream_index, | 
					
						
							|  |  |  |                              unsigned char *buf, int size, int force_pts) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVOutputFormat null_oformat = { | 
					
						
							|  |  |  |     "null", | 
					
						
							|  |  |  |     "null video format", | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  | #ifdef WORDS_BIGENDIAN
 | 
					
						
							|  |  |  |     CODEC_ID_PCM_S16BE, | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     CODEC_ID_PCM_S16LE, | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     CODEC_ID_RAWVIDEO, | 
					
						
							|  |  |  |     raw_write_header, | 
					
						
							|  |  |  |     null_write_packet, | 
					
						
							|  |  |  |     raw_write_trailer, | 
					
						
							| 
									
										
										
										
											2002-11-09 15:37:19 +00:00
										 |  |  |     .flags = AVFMT_NOFILE | AVFMT_RAWPICTURE, | 
					
						
							| 
									
										
										
										
											2002-10-14 17:55:34 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | int raw_init(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     av_register_input_format(&mp3_iformat); | 
					
						
							|  |  |  |     av_register_output_format(&mp2_oformat); | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     av_register_input_format(&ac3_iformat); | 
					
						
							|  |  |  |     av_register_output_format(&ac3_oformat); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     av_register_output_format(&h263_oformat); | 
					
						
							| 
									
										
										
										
											2002-09-11 18:46:47 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2002-09-12 11:10:33 +00:00
										 |  |  |     av_register_input_format(&m4v_iformat); | 
					
						
							| 
									
										
										
										
											2002-09-11 18:46:47 +00:00
										 |  |  |     av_register_output_format(&m4v_oformat); | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     av_register_input_format(&mpegvideo_iformat); | 
					
						
							|  |  |  |     av_register_output_format(&mpeg1video_oformat); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     av_register_input_format(&mjpeg_iformat); | 
					
						
							|  |  |  |     av_register_output_format(&mjpeg_oformat); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							| 
									
										
										
										
											2002-10-14 17:55:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     av_register_output_format(&null_oformat); | 
					
						
							| 
									
										
										
										
											2002-05-20 16:31:13 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } |