changeset 1373:b47a402bbe7f libavcodec

last frames & b frames encoding fix
author michaelni
date Wed, 23 Jul 2003 10:41:07 +0000
parents b52e62d17bbb
children f9b088451fb3
files apiexample.c mpegvideo.c
diffstat 2 files changed, 21 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/apiexample.c	Wed Jul 23 09:58:02 2003 +0000
+++ b/apiexample.c	Wed Jul 23 10:41:07 2003 +0000
@@ -195,6 +195,7 @@
     c->frame_rate = 25;  
     c->frame_rate_base= 1;
     c->gop_size = 10; /* emit one intra frame every ten frames */
+    c->max_b_frames=1;
 
     /* open it */
     if (avcodec_open(c, codec) < 0) {
@@ -225,7 +226,6 @@
 
     /* encode 1 second of video */
     for(i=0;i<25;i++) {
-        printf("encoding frame %3d\r", i);
         fflush(stdout);
         /* prepare a dummy image */
         /* Y */
@@ -245,6 +245,16 @@
 
         /* encode the image */
         out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
+        printf("encoding frame %3d (size=%5d)\n", i, out_size);
+        fwrite(outbuf, 1, out_size, f);
+    }
+
+    /* get the delayed frames */
+    for(; out_size; i++) {
+        fflush(stdout);
+        
+        out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
+        printf("write frame %3d (size=%5d)\n", i, out_size);
         fwrite(outbuf, 1, out_size, f);
     }
 
@@ -353,7 +363,7 @@
                 exit(1);
             }
             if (got_picture) {
-                printf("saving frame %3d\r", frame);
+                printf("saving frame %3d\n", frame);
                 fflush(stdout);
 
                 /* the picture is allocated by the decoder. no need to
@@ -374,7 +384,7 @@
     len = avcodec_decode_video(c, picture, &got_picture, 
                                NULL, 0);
     if (got_picture) {
-        printf("saving frame %3d\r", frame);
+        printf("saving last frame %3d\n", frame);
         fflush(stdout);
         
         /* the picture is allocated by the decoder. no need to
--- a/mpegvideo.c	Wed Jul 23 09:58:02 2003 +0000
+++ b/mpegvideo.c	Wed Jul 23 10:41:07 2003 +0000
@@ -1300,11 +1300,12 @@
 
 
 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
-    AVFrame *pic;
+    AVFrame *pic=NULL;
     int i;
     const int encoding_delay= s->max_b_frames;
     int direct=1;
-
+    
+  if(pic_arg){
     if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
     if(pic_arg->linesize[0] != s->linesize) direct=0;
     if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
@@ -1374,6 +1375,8 @@
     
     if(s->input_picture[encoding_delay])
         pic->display_picture_number= s->input_picture[encoding_delay]->display_picture_number + 1;
+    
+  }
 
     /* shift buffer entries */
     for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
@@ -1427,16 +1430,17 @@
                 }
             }else if(s->b_frame_strategy==0){
                 b_frames= s->max_b_frames;
+                while(b_frames && !s->input_picture[b_frames]) b_frames--;
             }else if(s->b_frame_strategy==1){
                 for(i=1; i<s->max_b_frames+1; i++){
-                    if(s->input_picture[i]->b_frame_score==0){
+                    if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
                         s->input_picture[i]->b_frame_score= 
                             get_intra_count(s, s->input_picture[i  ]->data[0], 
                                                s->input_picture[i-1]->data[0], s->linesize) + 1;
                     }
                 }
                 for(i=0; i<s->max_b_frames; i++){
-                    if(s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
+                    if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
                 }
                                 
                 b_frames= FFMAX(0, i-1);