3 * Copyright (c) 2001 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "mpegvideo.h"
23 void *av_mallocz(unsigned int size
)
27 if(size
== 0) fprintf(stderr
, "Warning, allocating 0 bytes\n");
29 ptr
= av_malloc(size
);
36 /* allocation of static arrays - do not use for normal allocation */
37 static unsigned int last_static
= 0;
38 static char*** array_static
= NULL
;
39 static const unsigned int grow_static
= 64; // ^2
40 void *__av_mallocz_static(void** location
, unsigned int size
)
42 int l
= (last_static
+ grow_static
) & ~(grow_static
- 1);
43 void *ptr
= av_mallocz(size
);
50 array_static
= realloc(array_static
, l
);
51 array_static
[last_static
++] = (char**) location
;
56 /* free all static arrays and reset pointers to 0 */
62 for (i
= 0; i
< last_static
; i
++)
64 free(*array_static
[i
]);
65 *array_static
[i
] = NULL
;
73 /* cannot call it directly because of 'void **' casting is not automatic */
74 void __av_freep(void **ptr
)
80 /* encoder management */
81 AVCodec
*first_avcodec
;
83 void register_avcodec(AVCodec
*format
)
87 while (*p
!= NULL
) p
= &(*p
)->next
;
92 void avcodec_get_chroma_sub_sample(int fmt
, int *h_shift
, int *v_shift
){
102 case PIX_FMT_YUV411P
:
106 case PIX_FMT_YUV422P
:
118 typedef struct DefaultPicOpaque
{
123 int avcodec_default_get_buffer(AVCodecContext
*s
, AVFrame
*pic
){
125 const int width
= s
->width
;
126 const int height
= s
->height
;
127 DefaultPicOpaque
*opaque
;
129 assert(pic
->data
[0]==NULL
);
130 assert(pic
->type
==0 || pic
->type
==FF_TYPE_INTERNAL
);
133 opaque
= (DefaultPicOpaque
*)pic
->opaque
;
135 pic
->data
[i
]= opaque
->data
[i
];
137 // printf("get_buffer %X coded_pic_num:%d last:%d\n", pic->opaque, pic->coded_picture_number, opaque->last_pic_num);
138 pic
->age
= pic
->coded_picture_number
- opaque
->last_pic_num
;
139 opaque
->last_pic_num
= pic
->coded_picture_number
;
140 //printf("age: %d %d %d\n", pic->age, c->picture_number, pic->coded_picture_number);
142 int align
, h_chroma_shift
, v_chroma_shift
;
143 int w
, h
, pixel_size
;
145 avcodec_get_chroma_sub_sample(s
->pix_fmt
, &h_chroma_shift
, &v_chroma_shift
);
163 if(s
->codec_id
==CODEC_ID_SVQ1
) align
=63;
166 w
= (width
+align
)&~align
;
167 h
= (height
+align
)&~align
;
169 if(!(s
->flags
&CODEC_FLAG_EMU_EDGE
)){
174 opaque
= av_mallocz(sizeof(DefaultPicOpaque
));
175 if(opaque
==NULL
) return -1;
178 opaque
->last_pic_num
= -256*256*256*64;
181 int h_shift
= i
==0 ? 0 : h_chroma_shift
;
182 int v_shift
= i
==0 ? 0 : v_chroma_shift
;
184 pic
->linesize
[i
]= pixel_size
*w
>>h_shift
;
186 pic
->base
[i
]= av_mallocz((pic
->linesize
[i
]*h
>>v_shift
)+16); //FIXME 16
187 if(pic
->base
[i
]==NULL
) return -1;
189 memset(pic
->base
[i
], 128, pic
->linesize
[i
]*h
>>v_shift
);
191 if(s
->flags
&CODEC_FLAG_EMU_EDGE
)
192 pic
->data
[i
] = pic
->base
[i
] + 16; //FIXME 16
194 pic
->data
[i
] = pic
->base
[i
] + (pic
->linesize
[i
]*EDGE_WIDTH
>>v_shift
) + (EDGE_WIDTH
>>h_shift
) + 16; //FIXME 16
196 opaque
->data
[i
]= pic
->data
[i
];
198 pic
->age
= 256*256*256*64;
199 pic
->type
= FF_BUFFER_TYPE_INTERNAL
;
205 void avcodec_default_release_buffer(AVCodecContext
*s
, AVFrame
*pic
){
208 assert(pic
->type
==FF_BUFFER_TYPE_INTERNAL
);
212 //printf("R%X\n", pic->opaque);
215 void avcodec_get_context_defaults(AVCodecContext
*s
){
216 s
->bit_rate
= 800*1000;
217 s
->bit_rate_tolerance
= s
->bit_rate
*10;
222 s
->rc_eq
= "tex^qComp";
225 s
->b_quant_factor
=1.25;
226 s
->b_quant_offset
=1.25;
227 s
->i_quant_factor
=-0.8;
228 s
->i_quant_offset
=0.0;
229 s
->error_concealment
= 3;
230 s
->error_resilience
= 1;
231 s
->workaround_bugs
= FF_BUG_AUTODETECT
;
232 s
->frame_rate
= 25 * FRAME_RATE_BASE
;
234 s
->me_method
= ME_EPZS
;
235 s
->get_buffer
= avcodec_default_get_buffer
;
236 s
->release_buffer
= avcodec_default_release_buffer
;
240 * allocates a AVCodecContext and set it to defaults.
241 * this can be deallocated by simply calling free()
243 AVCodecContext
*avcodec_alloc_context(void){
244 AVCodecContext
*avctx
= av_mallocz(sizeof(AVCodecContext
));
246 if(avctx
==NULL
) return NULL
;
248 avcodec_get_context_defaults(avctx
);
254 * allocates a AVPFrame and set it to defaults.
255 * this can be deallocated by simply calling free()
257 AVFrame
*avcodec_alloc_frame(void){
258 AVFrame
*pic
= av_mallocz(sizeof(AVFrame
));
263 int avcodec_open(AVCodecContext
*avctx
, AVCodec
*codec
)
267 avctx
->codec
= codec
;
268 avctx
->codec_id
= codec
->id
;
269 avctx
->frame_number
= 0;
270 if (codec
->priv_data_size
> 0) {
271 avctx
->priv_data
= av_mallocz(codec
->priv_data_size
);
272 if (!avctx
->priv_data
)
275 avctx
->priv_data
= NULL
;
277 ret
= avctx
->codec
->init(avctx
);
279 av_freep(&avctx
->priv_data
);
285 int avcodec_encode_audio(AVCodecContext
*avctx
, UINT8
*buf
, int buf_size
,
286 const short *samples
)
290 ret
= avctx
->codec
->encode(avctx
, buf
, buf_size
, (void *)samples
);
291 avctx
->frame_number
++;
295 int avcodec_encode_video(AVCodecContext
*avctx
, UINT8
*buf
, int buf_size
,
300 ret
= avctx
->codec
->encode(avctx
, buf
, buf_size
, (void *)pict
);
302 emms_c(); //needed to avoid a emms_c() call before every return;
304 avctx
->frame_number
++;
308 /* decode a frame. return -1 if error, otherwise return the number of
309 bytes used. If no frame could be decompressed, *got_picture_ptr is
310 zero. Otherwise, it is non zero */
311 int avcodec_decode_video(AVCodecContext
*avctx
, AVFrame
*picture
,
312 int *got_picture_ptr
,
313 UINT8
*buf
, int buf_size
)
316 //printf("avcodec_decode_video 1 %p\n", avctx->codec->decode);
318 ret
= avctx
->codec
->decode(avctx
, picture
, got_picture_ptr
,
321 emms_c(); //needed to avoid a emms_c() call before every return;
323 if (*got_picture_ptr
)
324 avctx
->frame_number
++;
328 /* decode an audio frame. return -1 if error, otherwise return the
329 *number of bytes used. If no frame could be decompressed,
330 *frame_size_ptr is zero. Otherwise, it is the decompressed frame
332 int avcodec_decode_audio(AVCodecContext
*avctx
, INT16
*samples
,
334 UINT8
*buf
, int buf_size
)
338 ret
= avctx
->codec
->decode(avctx
, samples
, frame_size_ptr
,
340 avctx
->frame_number
++;
344 int avcodec_close(AVCodecContext
*avctx
)
346 if (avctx
->codec
->close
)
347 avctx
->codec
->close(avctx
);
348 av_freep(&avctx
->priv_data
);
353 AVCodec
*avcodec_find_encoder(enum CodecID id
)
358 if (p
->encode
!= NULL
&& p
->id
== id
)
365 AVCodec
*avcodec_find_encoder_by_name(const char *name
)
370 if (p
->encode
!= NULL
&& strcmp(name
,p
->name
) == 0)
377 AVCodec
*avcodec_find_decoder(enum CodecID id
)
382 if (p
->decode
!= NULL
&& p
->id
== id
)
389 AVCodec
*avcodec_find_decoder_by_name(const char *name
)
394 if (p
->decode
!= NULL
&& strcmp(name
,p
->name
) == 0)
401 AVCodec
*avcodec_find(enum CodecID id
)
413 const char *pix_fmt_str
[] = {
426 void avcodec_string(char *buf
, int buf_size
, AVCodecContext
*enc
, int encode
)
428 const char *codec_name
;
431 char channels_str
[100];
435 p
= avcodec_find_encoder(enc
->codec_id
);
437 p
= avcodec_find_decoder(enc
->codec_id
);
440 codec_name
= p
->name
;
441 } else if (enc
->codec_name
[0] != '\0') {
442 codec_name
= enc
->codec_name
;
444 /* output avi tags */
445 if (enc
->codec_type
== CODEC_TYPE_VIDEO
) {
446 snprintf(buf1
, sizeof(buf1
), "%c%c%c%c",
447 enc
->codec_tag
& 0xff,
448 (enc
->codec_tag
>> 8) & 0xff,
449 (enc
->codec_tag
>> 16) & 0xff,
450 (enc
->codec_tag
>> 24) & 0xff);
452 snprintf(buf1
, sizeof(buf1
), "0x%04x", enc
->codec_tag
);
457 switch(enc
->codec_type
) {
458 case CODEC_TYPE_VIDEO
:
459 snprintf(buf
, buf_size
,
461 codec_name
, enc
->flags
& CODEC_FLAG_HQ
? " (hq)" : "");
462 if (enc
->codec_id
== CODEC_ID_RAWVIDEO
) {
463 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
465 pix_fmt_str
[enc
->pix_fmt
]);
468 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
469 ", %dx%d, %0.2f fps",
470 enc
->width
, enc
->height
,
471 (float)enc
->frame_rate
/ FRAME_RATE_BASE
);
474 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
475 ", q=%d-%d", enc
->qmin
, enc
->qmax
);
477 bitrate
= enc
->bit_rate
;
479 case CODEC_TYPE_AUDIO
:
480 snprintf(buf
, buf_size
,
483 switch (enc
->channels
) {
485 strcpy(channels_str
, "mono");
488 strcpy(channels_str
, "stereo");
491 strcpy(channels_str
, "5:1");
494 sprintf(channels_str
, "%d channels", enc
->channels
);
497 if (enc
->sample_rate
) {
498 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
504 /* for PCM codecs, compute bitrate directly */
505 switch(enc
->codec_id
) {
506 case CODEC_ID_PCM_S16LE
:
507 case CODEC_ID_PCM_S16BE
:
508 case CODEC_ID_PCM_U16LE
:
509 case CODEC_ID_PCM_U16BE
:
510 bitrate
= enc
->sample_rate
* enc
->channels
* 16;
512 case CODEC_ID_PCM_S8
:
513 case CODEC_ID_PCM_U8
:
514 case CODEC_ID_PCM_ALAW
:
515 case CODEC_ID_PCM_MULAW
:
516 bitrate
= enc
->sample_rate
* enc
->channels
* 8;
519 bitrate
= enc
->bit_rate
;
527 if (enc
->flags
& CODEC_FLAG_PASS1
)
528 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
530 if (enc
->flags
& CODEC_FLAG_PASS2
)
531 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
535 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
536 ", %d kb/s", bitrate
/ 1000);
540 /* Picture field are filled with 'ptr' addresses */
541 void avpicture_fill(AVPicture
*picture
, UINT8
*ptr
,
542 int pix_fmt
, int width
, int height
)
546 size
= width
* height
;
548 case PIX_FMT_YUV420P
:
549 picture
->data
[0] = ptr
;
550 picture
->data
[1] = picture
->data
[0] + size
;
551 picture
->data
[2] = picture
->data
[1] + size
/ 4;
552 picture
->linesize
[0] = width
;
553 picture
->linesize
[1] = width
/ 2;
554 picture
->linesize
[2] = width
/ 2;
556 case PIX_FMT_YUV422P
:
557 picture
->data
[0] = ptr
;
558 picture
->data
[1] = picture
->data
[0] + size
;
559 picture
->data
[2] = picture
->data
[1] + size
/ 2;
560 picture
->linesize
[0] = width
;
561 picture
->linesize
[1] = width
/ 2;
562 picture
->linesize
[2] = width
/ 2;
564 case PIX_FMT_YUV444P
:
565 picture
->data
[0] = ptr
;
566 picture
->data
[1] = picture
->data
[0] + size
;
567 picture
->data
[2] = picture
->data
[1] + size
;
568 picture
->linesize
[0] = width
;
569 picture
->linesize
[1] = width
;
570 picture
->linesize
[2] = width
;
574 picture
->data
[0] = ptr
;
575 picture
->data
[1] = NULL
;
576 picture
->data
[2] = NULL
;
577 picture
->linesize
[0] = width
* 3;
581 picture
->data
[0] = ptr
;
582 picture
->data
[1] = NULL
;
583 picture
->data
[2] = NULL
;
584 picture
->linesize
[0] = width
* 4;
587 picture
->data
[0] = ptr
;
588 picture
->data
[1] = NULL
;
589 picture
->data
[2] = NULL
;
590 picture
->linesize
[0] = width
* 2;
593 picture
->data
[0] = NULL
;
594 picture
->data
[1] = NULL
;
595 picture
->data
[2] = NULL
;
600 int avpicture_get_size(int pix_fmt
, int width
, int height
)
604 size
= width
* height
;
606 case PIX_FMT_YUV420P
:
607 size
= (size
* 3) / 2;
609 case PIX_FMT_YUV422P
:
612 case PIX_FMT_YUV444P
:
633 unsigned avcodec_version( void )
635 return LIBAVCODEC_VERSION_INT
;
638 unsigned avcodec_build( void )
640 return LIBAVCODEC_BUILD
;
643 /* must be called before any other functions */
644 void avcodec_init(void)
646 static int inited
= 0;
655 /* this can be called after seeking and before trying to decode the next keyframe */
656 void avcodec_flush_buffers(AVCodecContext
*avctx
)
659 MpegEncContext
*s
= avctx
->priv_data
;
661 switch(avctx
->codec_id
){
662 case CODEC_ID_MPEG1VIDEO
:
666 case CODEC_ID_MJPEGB
:
668 case CODEC_ID_MSMPEG4V1
:
669 case CODEC_ID_MSMPEG4V2
:
670 case CODEC_ID_MSMPEG4V3
:
676 for(i
=0; i
<MAX_PICTURE_COUNT
; i
++){
677 if(s
->picture
[i
].data
[0] && ( s
->picture
[i
].type
== FF_BUFFER_TYPE_INTERNAL
678 || s
->picture
[i
].type
== FF_BUFFER_TYPE_USER
))
679 avctx
->release_buffer(avctx
, (AVFrame
*)&s
->picture
[i
]);
688 static int raw_encode_init(AVCodecContext
*s
)
693 static int raw_decode_frame(AVCodecContext
*avctx
,
694 void *data
, int *data_size
,
695 UINT8
*buf
, int buf_size
)
700 static int raw_encode_frame(AVCodecContext
*avctx
,
701 unsigned char *frame
, int buf_size
, void *data
)
706 AVCodec rawvideo_codec
= {