| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * utils for libavcodec | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * Copyright (c) 2001 Fabrice Bellard. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +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:45:33 +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:45:33 +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:45:33 +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 "avcodec.h"
 | 
					
						
							| 
									
										
										
										
											2002-05-18 22:59:50 +00:00
										 |  |  | #include "dsputil.h"
 | 
					
						
							| 
									
										
										
										
											2002-04-24 01:24:06 +00:00
										 |  |  | #include "mpegvideo.h"
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-18 22:59:50 +00:00
										 |  |  | void *av_mallocz(int size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     void *ptr; | 
					
						
							|  |  |  |     ptr = av_malloc(size); | 
					
						
							|  |  |  |     if (!ptr) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     memset(ptr, 0, size); | 
					
						
							|  |  |  |     return ptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-20 16:23:27 +00:00
										 |  |  | /* cannot call it directly because of 'void **' casting is not automatic */ | 
					
						
							|  |  |  | void __av_freep(void **ptr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     av_free(*ptr); | 
					
						
							|  |  |  |     *ptr = NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /* encoder management */ | 
					
						
							|  |  |  | AVCodec *first_avcodec; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void register_avcodec(AVCodec *format) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     AVCodec **p; | 
					
						
							|  |  |  |     p = &first_avcodec; | 
					
						
							|  |  |  |     while (*p != NULL) p = &(*p)->next; | 
					
						
							|  |  |  |     *p = format; | 
					
						
							|  |  |  |     format->next = NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-19 09:13:43 +00:00
										 |  |  | void avcodec_get_context_defaults(AVCodecContext *s){ | 
					
						
							| 
									
										
										
										
											2002-09-19 18:24:52 +00:00
										 |  |  |     s->bit_rate= 800*1000; | 
					
						
							|  |  |  |     s->bit_rate_tolerance= s->bit_rate*10; | 
					
						
							| 
									
										
										
										
											2002-09-19 09:13:43 +00:00
										 |  |  |     s->qmin= 2; | 
					
						
							|  |  |  |     s->qmax= 31; | 
					
						
							|  |  |  |     s->rc_eq= "tex^qComp"; | 
					
						
							|  |  |  |     s->qcompress= 0.5; | 
					
						
							| 
									
										
										
										
											2002-09-19 18:24:52 +00:00
										 |  |  |     s->max_qdiff= 3; | 
					
						
							|  |  |  |     s->b_quant_factor=1.25; | 
					
						
							|  |  |  |     s->b_quant_offset=1.25; | 
					
						
							| 
									
										
										
										
											2002-09-19 20:22:39 +00:00
										 |  |  |     s->i_quant_factor=-0.8; | 
					
						
							| 
									
										
										
										
											2002-09-19 18:24:52 +00:00
										 |  |  |     s->i_quant_offset=0.0; | 
					
						
							| 
									
										
										
										
											2002-10-13 13:16:04 +00:00
										 |  |  |     s->error_concealment= 3; | 
					
						
							| 
									
										
										
										
											2002-10-22 23:43:25 +00:00
										 |  |  |     s->error_resilience= 1; | 
					
						
							| 
									
										
										
										
											2002-10-13 13:16:04 +00:00
										 |  |  |     s->workaround_bugs= FF_BUG_AUTODETECT; | 
					
						
							| 
									
										
										
										
											2002-10-22 23:43:25 +00:00
										 |  |  |     s->frame_rate = 25 * FRAME_RATE_BASE; | 
					
						
							|  |  |  |     s->gop_size= 50; | 
					
						
							|  |  |  |     s->me_method= ME_EPZS; | 
					
						
							| 
									
										
										
										
											2002-09-19 09:13:43 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * allocates a AVCodecContext and set it to defaults. | 
					
						
							|  |  |  |  * this can be deallocated by simply calling free()  | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2002-09-28 01:49:37 +00:00
										 |  |  | AVCodecContext *avcodec_alloc_context(void){ | 
					
						
							| 
									
										
										
										
											2002-09-19 09:13:43 +00:00
										 |  |  |     AVCodecContext *avctx= av_mallocz(sizeof(AVCodecContext)); | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     if(avctx==NULL) return NULL; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     avcodec_get_context_defaults(avctx); | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     return avctx; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | int avcodec_open(AVCodecContext *avctx, AVCodec *codec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     avctx->codec = codec; | 
					
						
							|  |  |  |     avctx->frame_number = 0; | 
					
						
							| 
									
										
										
										
											2002-05-09 01:24:27 +00:00
										 |  |  |     if (codec->priv_data_size > 0) { | 
					
						
							|  |  |  |         avctx->priv_data = av_mallocz(codec->priv_data_size); | 
					
						
							|  |  |  |         if (!avctx->priv_data)  | 
					
						
							|  |  |  |             return -ENOMEM; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         avctx->priv_data = NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     ret = avctx->codec->init(avctx); | 
					
						
							|  |  |  |     if (ret < 0) { | 
					
						
							| 
									
										
										
										
											2002-05-18 22:59:50 +00:00
										 |  |  |         av_freep(&avctx->priv_data); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         return ret; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int avcodec_encode_audio(AVCodecContext *avctx, UINT8 *buf, int buf_size,  | 
					
						
							|  |  |  |                          const short *samples) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = avctx->codec->encode(avctx, buf, buf_size, (void *)samples); | 
					
						
							|  |  |  |     avctx->frame_number++; | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size,  | 
					
						
							|  |  |  |                          const AVPicture *pict) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict); | 
					
						
							| 
									
										
										
										
											2002-10-31 12:11:53 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     emms_c(); //needed to avoid a emms_c() call before every return;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     avctx->frame_number++; | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* decode a frame. return -1 if error, otherwise return the number of
 | 
					
						
							|  |  |  |    bytes used. If no frame could be decompressed, *got_picture_ptr is | 
					
						
							|  |  |  |    zero. Otherwise, it is non zero */ | 
					
						
							|  |  |  | int avcodec_decode_video(AVCodecContext *avctx, AVPicture *picture,  | 
					
						
							|  |  |  |                          int *got_picture_ptr, | 
					
						
							|  |  |  |                          UINT8 *buf, int buf_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = avctx->codec->decode(avctx, picture, got_picture_ptr,  | 
					
						
							|  |  |  |                                buf, buf_size); | 
					
						
							| 
									
										
										
										
											2002-10-31 12:11:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     emms_c(); //needed to avoid a emms_c() call before every return;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-16 02:41:00 +00:00
										 |  |  |     if (*got_picture_ptr)                            | 
					
						
							|  |  |  |         avctx->frame_number++; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* decode an audio frame. return -1 if error, otherwise return the
 | 
					
						
							|  |  |  |    *number of bytes used. If no frame could be decompressed, | 
					
						
							|  |  |  |    *frame_size_ptr is zero. Otherwise, it is the decompressed frame | 
					
						
							|  |  |  |    *size in BYTES. */ | 
					
						
							|  |  |  | int avcodec_decode_audio(AVCodecContext *avctx, INT16 *samples,  | 
					
						
							|  |  |  |                          int *frame_size_ptr, | 
					
						
							|  |  |  |                          UINT8 *buf, int buf_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = avctx->codec->decode(avctx, samples, frame_size_ptr,  | 
					
						
							|  |  |  |                                buf, buf_size); | 
					
						
							|  |  |  |     avctx->frame_number++; | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int avcodec_close(AVCodecContext *avctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (avctx->codec->close) | 
					
						
							|  |  |  |         avctx->codec->close(avctx); | 
					
						
							| 
									
										
										
										
											2002-05-18 22:59:50 +00:00
										 |  |  |     av_freep(&avctx->priv_data); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     avctx->codec = NULL; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodec *avcodec_find_encoder(enum CodecID id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     AVCodec *p; | 
					
						
							|  |  |  |     p = first_avcodec; | 
					
						
							|  |  |  |     while (p) { | 
					
						
							|  |  |  |         if (p->encode != NULL && p->id == id) | 
					
						
							|  |  |  |             return p; | 
					
						
							|  |  |  |         p = p->next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-23 22:25:18 +00:00
										 |  |  | AVCodec *avcodec_find_encoder_by_name(const char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     AVCodec *p; | 
					
						
							|  |  |  |     p = first_avcodec; | 
					
						
							|  |  |  |     while (p) { | 
					
						
							|  |  |  |         if (p->encode != NULL && strcmp(name,p->name) == 0) | 
					
						
							|  |  |  |             return p; | 
					
						
							|  |  |  |         p = p->next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | AVCodec *avcodec_find_decoder(enum CodecID id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     AVCodec *p; | 
					
						
							|  |  |  |     p = first_avcodec; | 
					
						
							|  |  |  |     while (p) { | 
					
						
							|  |  |  |         if (p->decode != NULL && p->id == id) | 
					
						
							|  |  |  |             return p; | 
					
						
							|  |  |  |         p = p->next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodec *avcodec_find_decoder_by_name(const char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     AVCodec *p; | 
					
						
							|  |  |  |     p = first_avcodec; | 
					
						
							|  |  |  |     while (p) { | 
					
						
							|  |  |  |         if (p->decode != NULL && strcmp(name,p->name) == 0) | 
					
						
							|  |  |  |             return p; | 
					
						
							|  |  |  |         p = p->next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodec *avcodec_find(enum CodecID id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     AVCodec *p; | 
					
						
							|  |  |  |     p = first_avcodec; | 
					
						
							|  |  |  |     while (p) { | 
					
						
							|  |  |  |         if (p->id == id) | 
					
						
							|  |  |  |             return p; | 
					
						
							|  |  |  |         p = p->next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:31 +00:00
										 |  |  | const char *pix_fmt_str[] = { | 
					
						
							|  |  |  |     "yuv420p", | 
					
						
							|  |  |  |     "yuv422", | 
					
						
							|  |  |  |     "rgb24", | 
					
						
							|  |  |  |     "bgr24", | 
					
						
							|  |  |  |     "yuv422p", | 
					
						
							|  |  |  |     "yuv444p", | 
					
						
							| 
									
										
										
										
											2002-07-27 03:08:04 +00:00
										 |  |  |     "rgba32", | 
					
						
							|  |  |  |     "bgra32", | 
					
						
							| 
									
										
										
										
											2002-10-11 09:16:35 +00:00
										 |  |  |     "yuv410p", | 
					
						
							|  |  |  |     "yuv411p", | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:31 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-10-11 09:16:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *codec_name; | 
					
						
							|  |  |  |     AVCodec *p; | 
					
						
							|  |  |  |     char buf1[32]; | 
					
						
							| 
									
										
										
										
											2002-04-22 19:57:26 +00:00
										 |  |  |     char channels_str[100]; | 
					
						
							| 
									
										
										
										
											2001-09-23 17:16:51 +00:00
										 |  |  |     int bitrate; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (encode) | 
					
						
							|  |  |  |         p = avcodec_find_encoder(enc->codec_id); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         p = avcodec_find_decoder(enc->codec_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (p) { | 
					
						
							|  |  |  |         codec_name = p->name; | 
					
						
							|  |  |  |     } else if (enc->codec_name[0] != '\0') { | 
					
						
							|  |  |  |         codec_name = enc->codec_name; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         /* output avi tags */ | 
					
						
							|  |  |  |         if (enc->codec_type == CODEC_TYPE_VIDEO) { | 
					
						
							|  |  |  |             snprintf(buf1, sizeof(buf1), "%c%c%c%c",  | 
					
						
							|  |  |  |                      enc->codec_tag & 0xff, | 
					
						
							|  |  |  |                      (enc->codec_tag >> 8) & 0xff, | 
					
						
							|  |  |  |                      (enc->codec_tag >> 16) & 0xff, | 
					
						
							|  |  |  |                      (enc->codec_tag >> 24) & 0xff); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         codec_name = buf1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch(enc->codec_type) { | 
					
						
							|  |  |  |     case CODEC_TYPE_VIDEO: | 
					
						
							|  |  |  |         snprintf(buf, buf_size, | 
					
						
							|  |  |  |                  "Video: %s%s", | 
					
						
							|  |  |  |                  codec_name, enc->flags & CODEC_FLAG_HQ ? " (hq)" : ""); | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:31 +00:00
										 |  |  |         if (enc->codec_id == CODEC_ID_RAWVIDEO) { | 
					
						
							|  |  |  |             snprintf(buf + strlen(buf), buf_size - strlen(buf), | 
					
						
							|  |  |  |                      ", %s", | 
					
						
							|  |  |  |                      pix_fmt_str[enc->pix_fmt]); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         if (enc->width) { | 
					
						
							|  |  |  |             snprintf(buf + strlen(buf), buf_size - strlen(buf), | 
					
						
							|  |  |  |                      ", %dx%d, %0.2f fps", | 
					
						
							|  |  |  |                      enc->width, enc->height,  | 
					
						
							|  |  |  |                      (float)enc->frame_rate / FRAME_RATE_BASE); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-10-10 17:12:55 +00:00
										 |  |  |         if (encode) { | 
					
						
							|  |  |  |             snprintf(buf + strlen(buf), buf_size - strlen(buf), | 
					
						
							|  |  |  |                      ", q=%d-%d", enc->qmin, enc->qmax); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-09-23 17:16:51 +00:00
										 |  |  |         bitrate = enc->bit_rate; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         break; | 
					
						
							|  |  |  |     case CODEC_TYPE_AUDIO: | 
					
						
							|  |  |  |         snprintf(buf, buf_size, | 
					
						
							|  |  |  |                  "Audio: %s", | 
					
						
							|  |  |  |                  codec_name); | 
					
						
							| 
									
										
										
										
											2002-04-09 04:52:49 +00:00
										 |  |  |         switch (enc->channels) { | 
					
						
							|  |  |  |             case 1: | 
					
						
							| 
									
										
										
										
											2002-04-22 19:57:26 +00:00
										 |  |  |                 strcpy(channels_str, "mono"); | 
					
						
							| 
									
										
										
										
											2002-04-09 04:52:49 +00:00
										 |  |  |                 break; | 
					
						
							|  |  |  |             case 2: | 
					
						
							| 
									
										
										
										
											2002-04-22 19:57:26 +00:00
										 |  |  |                 strcpy(channels_str, "stereo"); | 
					
						
							| 
									
										
										
										
											2002-04-09 04:52:49 +00:00
										 |  |  |                 break; | 
					
						
							|  |  |  |             case 6: | 
					
						
							| 
									
										
										
										
											2002-04-22 19:57:26 +00:00
										 |  |  |                 strcpy(channels_str, "5:1"); | 
					
						
							| 
									
										
										
										
											2002-04-09 04:52:49 +00:00
										 |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 sprintf(channels_str, "%d channels", enc->channels); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         if (enc->sample_rate) { | 
					
						
							|  |  |  |             snprintf(buf + strlen(buf), buf_size - strlen(buf), | 
					
						
							|  |  |  |                      ", %d Hz, %s", | 
					
						
							|  |  |  |                      enc->sample_rate, | 
					
						
							| 
									
										
										
										
											2002-04-09 04:52:49 +00:00
										 |  |  |                      channels_str); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-04-09 04:52:49 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2001-09-23 17:16:51 +00:00
										 |  |  |         /* for PCM codecs, compute bitrate directly */ | 
					
						
							|  |  |  |         switch(enc->codec_id) { | 
					
						
							|  |  |  |         case CODEC_ID_PCM_S16LE: | 
					
						
							|  |  |  |         case CODEC_ID_PCM_S16BE: | 
					
						
							|  |  |  |         case CODEC_ID_PCM_U16LE: | 
					
						
							|  |  |  |         case CODEC_ID_PCM_U16BE: | 
					
						
							| 
									
										
										
										
											2001-09-24 23:29:46 +00:00
										 |  |  |             bitrate = enc->sample_rate * enc->channels * 16; | 
					
						
							| 
									
										
										
										
											2001-09-23 17:16:51 +00:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case CODEC_ID_PCM_S8: | 
					
						
							|  |  |  |         case CODEC_ID_PCM_U8: | 
					
						
							|  |  |  |         case CODEC_ID_PCM_ALAW: | 
					
						
							|  |  |  |         case CODEC_ID_PCM_MULAW: | 
					
						
							| 
									
										
										
										
											2001-09-24 23:29:46 +00:00
										 |  |  |             bitrate = enc->sample_rate * enc->channels * 8; | 
					
						
							| 
									
										
										
										
											2001-09-23 17:16:51 +00:00
										 |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             bitrate = enc->bit_rate; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         break; | 
					
						
							|  |  |  |     default: | 
					
						
							| 
									
										
										
										
											2002-07-27 03:08:04 +00:00
										 |  |  |         av_abort(); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-10-10 17:12:55 +00:00
										 |  |  |     if (encode) { | 
					
						
							|  |  |  |         if (enc->flags & CODEC_FLAG_PASS1) | 
					
						
							|  |  |  |             snprintf(buf + strlen(buf), buf_size - strlen(buf), | 
					
						
							|  |  |  |                      ", pass 1"); | 
					
						
							|  |  |  |         if (enc->flags & CODEC_FLAG_PASS2) | 
					
						
							|  |  |  |             snprintf(buf + strlen(buf), buf_size - strlen(buf), | 
					
						
							|  |  |  |                      ", pass 2"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-09-23 17:16:51 +00:00
										 |  |  |     if (bitrate != 0) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         snprintf(buf + strlen(buf), buf_size - strlen(buf),  | 
					
						
							| 
									
										
										
										
											2001-09-23 17:16:51 +00:00
										 |  |  |                  ", %d kb/s", bitrate / 1000); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:31 +00:00
										 |  |  | /* Picture field are filled with 'ptr' addresses */ | 
					
						
							|  |  |  | void avpicture_fill(AVPicture *picture, UINT8 *ptr, | 
					
						
							|  |  |  |                     int pix_fmt, int width, int height) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     size = width * height; | 
					
						
							|  |  |  |     switch(pix_fmt) { | 
					
						
							|  |  |  |     case PIX_FMT_YUV420P: | 
					
						
							|  |  |  |         picture->data[0] = ptr; | 
					
						
							|  |  |  |         picture->data[1] = picture->data[0] + size; | 
					
						
							|  |  |  |         picture->data[2] = picture->data[1] + size / 4; | 
					
						
							|  |  |  |         picture->linesize[0] = width; | 
					
						
							|  |  |  |         picture->linesize[1] = width / 2; | 
					
						
							|  |  |  |         picture->linesize[2] = width / 2; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case PIX_FMT_YUV422P: | 
					
						
							|  |  |  |         picture->data[0] = ptr; | 
					
						
							|  |  |  |         picture->data[1] = picture->data[0] + size; | 
					
						
							|  |  |  |         picture->data[2] = picture->data[1] + size / 2; | 
					
						
							|  |  |  |         picture->linesize[0] = width; | 
					
						
							|  |  |  |         picture->linesize[1] = width / 2; | 
					
						
							|  |  |  |         picture->linesize[2] = width / 2; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case PIX_FMT_YUV444P: | 
					
						
							|  |  |  |         picture->data[0] = ptr; | 
					
						
							|  |  |  |         picture->data[1] = picture->data[0] + size; | 
					
						
							|  |  |  |         picture->data[2] = picture->data[1] + size; | 
					
						
							|  |  |  |         picture->linesize[0] = width; | 
					
						
							|  |  |  |         picture->linesize[1] = width; | 
					
						
							|  |  |  |         picture->linesize[2] = width; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case PIX_FMT_RGB24: | 
					
						
							|  |  |  |     case PIX_FMT_BGR24: | 
					
						
							|  |  |  |         picture->data[0] = ptr; | 
					
						
							|  |  |  |         picture->data[1] = NULL; | 
					
						
							|  |  |  |         picture->data[2] = NULL; | 
					
						
							|  |  |  |         picture->linesize[0] = width * 3; | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2002-07-27 03:08:04 +00:00
										 |  |  |     case PIX_FMT_RGBA32: | 
					
						
							|  |  |  |     case PIX_FMT_BGRA32: | 
					
						
							|  |  |  |         picture->data[0] = ptr; | 
					
						
							|  |  |  |         picture->data[1] = NULL; | 
					
						
							|  |  |  |         picture->data[2] = NULL; | 
					
						
							|  |  |  |         picture->linesize[0] = width * 4; | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:31 +00:00
										 |  |  |     case PIX_FMT_YUV422: | 
					
						
							|  |  |  |         picture->data[0] = ptr; | 
					
						
							|  |  |  |         picture->data[1] = NULL; | 
					
						
							|  |  |  |         picture->data[2] = NULL; | 
					
						
							|  |  |  |         picture->linesize[0] = width * 2; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         picture->data[0] = NULL; | 
					
						
							|  |  |  |         picture->data[1] = NULL; | 
					
						
							|  |  |  |         picture->data[2] = NULL; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int avpicture_get_size(int pix_fmt, int width, int height) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     size = width * height; | 
					
						
							|  |  |  |     switch(pix_fmt) { | 
					
						
							|  |  |  |     case PIX_FMT_YUV420P: | 
					
						
							|  |  |  |         size = (size * 3) / 2; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case PIX_FMT_YUV422P: | 
					
						
							|  |  |  |         size = (size * 2); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case PIX_FMT_YUV444P: | 
					
						
							|  |  |  |         size = (size * 3); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case PIX_FMT_RGB24: | 
					
						
							|  |  |  |     case PIX_FMT_BGR24: | 
					
						
							|  |  |  |         size = (size * 3); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2002-07-27 03:08:04 +00:00
										 |  |  |     case PIX_FMT_RGBA32: | 
					
						
							|  |  |  |     case PIX_FMT_BGRA32: | 
					
						
							|  |  |  |         size = (size * 4); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:31 +00:00
										 |  |  |     case PIX_FMT_YUV422: | 
					
						
							|  |  |  |         size = (size * 2); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         size = -1; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return size; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-05 09:56:13 +00:00
										 |  |  | unsigned avcodec_version( void ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return LIBAVCODEC_VERSION_INT; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-12 15:53:25 +00:00
										 |  |  | unsigned avcodec_build( void ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return LIBAVCODEC_BUILD; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /* must be called before any other functions */ | 
					
						
							|  |  |  | void avcodec_init(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-04-01 13:24:47 +00:00
										 |  |  |     static int inited = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (inited != 0) | 
					
						
							|  |  |  | 	return; | 
					
						
							|  |  |  |     inited = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-11 09:31:17 +00:00
										 |  |  |     //dsputil_init();
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-04-24 01:24:06 +00:00
										 |  |  | /* this should be called after seeking and before trying to decode the next frame */ | 
					
						
							|  |  |  | void avcodec_flush_buffers(AVCodecContext *avctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     MpegEncContext *s = avctx->priv_data; | 
					
						
							|  |  |  |     s->num_available_buffers=0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-27 16:42:14 +00:00
										 |  |  | static int raw_encode_init(AVCodecContext *s) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-27 16:42:14 +00:00
										 |  |  | static int raw_decode_frame(AVCodecContext *avctx, | 
					
						
							|  |  |  | 			    void *data, int *data_size, | 
					
						
							|  |  |  | 			    UINT8 *buf, int buf_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-27 16:42:14 +00:00
										 |  |  | static int raw_encode_frame(AVCodecContext *avctx, | 
					
						
							|  |  |  | 			    unsigned char *frame, int buf_size, void *data) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodec rawvideo_codec = { | 
					
						
							|  |  |  |     "rawvideo", | 
					
						
							|  |  |  |     CODEC_TYPE_VIDEO, | 
					
						
							|  |  |  |     CODEC_ID_RAWVIDEO, | 
					
						
							|  |  |  |     0, | 
					
						
							| 
									
										
										
										
											2002-05-27 16:42:14 +00:00
										 |  |  |     raw_encode_init, | 
					
						
							|  |  |  |     raw_encode_frame, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     NULL, | 
					
						
							| 
									
										
										
										
											2002-05-27 16:42:14 +00:00
										 |  |  |     raw_decode_frame, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | }; |