@ -36,12 +36,39 @@
# include <libavutil/opt.h>
# include <libavutil/imgutils.h>
static void encode ( AVCodecContext * enc_ctx , AVFrame * frame , AVPacket * pkt ,
FILE * outfile )
{
int ret ;
/* send the frame to the encoder */
ret = avcodec_send_frame ( enc_ctx , frame ) ;
if ( ret < 0 ) {
fprintf ( stderr , " Error sending a frame for encoding \n " ) ;
exit ( 1 ) ;
}
while ( ret > = 0 ) {
ret = avcodec_receive_packet ( enc_ctx , pkt ) ;
if ( ret = = AVERROR ( EAGAIN ) | | ret = = AVERROR_EOF )
return ;
else if ( ret < 0 ) {
fprintf ( stderr , " Error during encoding \n " ) ;
exit ( 1 ) ;
}
printf ( " Write frame %3 " PRId64 " (size=%5d) \n " , pkt - > pts , pkt - > size ) ;
fwrite ( pkt - > data , 1 , pkt - > size , outfile ) ;
av_packet_unref ( pkt ) ;
}
}
int main ( int argc , char * * argv )
{
const char * filename , * codec_name ;
const AVCodec * codec ;
AVCodecContext * c = NULL ;
int i , ret , x , y , got_output ;
int i , ret , x , y ;
FILE * f ;
AVFrame * frame ;
AVPacket pkt ;
@ -150,35 +177,11 @@ int main(int argc, char **argv)
frame - > pts = i ;
/* encode the image */
ret = avcodec_encode_video2 ( c , & pkt , frame , & got_output ) ;
if ( ret < 0 ) {
fprintf ( stderr , " Error encoding frame \n " ) ;
exit ( 1 ) ;
}
if ( got_output ) {
printf ( " Write frame %3d (size=%5d) \n " , i , pkt . size ) ;
fwrite ( pkt . data , 1 , pkt . size , f ) ;
av_packet_unref ( & pkt ) ;
}
encode ( c , frame , & pkt , f ) ;
}
/* get the delayed frames */
for ( got_output = 1 ; got_output ; i + + ) {
fflush ( stdout ) ;
ret = avcodec_encode_video2 ( c , & pkt , NULL , & got_output ) ;
if ( ret < 0 ) {
fprintf ( stderr , " Error encoding frame \n " ) ;
exit ( 1 ) ;
}
if ( got_output ) {
printf ( " Write frame %3d (size=%5d) \n " , i , pkt . size ) ;
fwrite ( pkt . data , 1 , pkt . size , f ) ;
av_packet_unref ( & pkt ) ;
}
}
/* flush the encoder */
encode ( c , NULL , & pkt , f ) ;
/* add sequence end code to have a real MPEG file */
fwrite ( endcode , 1 , sizeof ( endcode ) , f ) ;