]> git.sesse.net Git - ffmpeg/blobdiff - output_example.c
clear blocks after each idct instead of per picture
[ffmpeg] / output_example.c
index 45f6a0645b70c593949f29287315848515b342ed..37368ff1ecb9e51dc62b2d0344bd1e46bebe8962 100644 (file)
@@ -140,18 +140,23 @@ void get_audio_frame(int16_t *samples, int frame_size, int nb_channels)
 
 void write_audio_frame(AVFormatContext *oc, AVStream *st)
 {
-    int out_size;
     AVCodecContext *c;
-
-
+    AVPacket pkt;
+    av_init_packet(&pkt);
+    
     c = &st->codec;
 
     get_audio_frame(samples, audio_input_frame_size, c->channels);
 
-    out_size = avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, samples);
+    pkt.size= avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, samples);
+
+    pkt.pts= c->coded_frame->pts;
+    pkt.flags |= PKT_FLAG_KEY;
+    pkt.stream_index= st->index;
+    pkt.data= audio_outbuf;
 
     /* write the compressed frame in the media file */
-    if (av_write_frame(oc, st->index, audio_outbuf, out_size) != 0) {
+    if (av_write_frame(oc, &pkt) != 0) {
         fprintf(stderr, "Error while writing audio frame\n");
         exit(1);
     }
@@ -194,8 +199,8 @@ AVStream *add_video_stream(AVFormatContext *oc, int codec_id)
     c->width = 352;  
     c->height = 288;
     /* frames per second */
-    c->frame_rate = STREAM_FRAME_RATE;  
-    c->frame_rate_base = 1;
+    c->time_base.den = STREAM_FRAME_RATE;  
+    c->time_base.num = 1;
     c->gop_size = 12; /* emit one intra frame every twelve frames at most */
     if (c->codec_id == CODEC_ID_MPEG2VIDEO) {
         /* just for testing, we also add B frames */
@@ -336,16 +341,32 @@ void write_video_frame(AVFormatContext *oc, AVStream *st)
     if (oc->oformat->flags & AVFMT_RAWPICTURE) {
         /* raw video case. The API will change slightly in the near
            futur for that */
-        ret = av_write_frame(oc, st->index, 
-                       (uint8_t *)picture_ptr, sizeof(AVPicture));
+        AVPacket pkt;
+        av_init_packet(&pkt);
+        
+        pkt.flags |= PKT_FLAG_KEY;
+        pkt.stream_index= st->index;
+        pkt.data= (uint8_t *)picture_ptr;
+        pkt.size= sizeof(AVPicture);
+        
+        ret = av_write_frame(oc, &pkt);
     } else {
         /* encode the image */
         out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture_ptr);
         /* if zero size, it means the image was buffered */
         if (out_size != 0) {
+            AVPacket pkt;
+            av_init_packet(&pkt);
+            
+            pkt.pts= c->coded_frame->pts;
+            if(c->coded_frame->key_frame)
+                pkt.flags |= PKT_FLAG_KEY;
+            pkt.stream_index= st->index;
+            pkt.data= video_outbuf;
+            pkt.size= out_size;
+            
             /* write the compressed frame in the media file */
-            /* XXX: in case of B frames, the pts is not yet valid */
-            ret = av_write_frame(oc, st->index, video_outbuf, out_size);
+            ret = av_write_frame(oc, &pkt);
         } else {
             ret = 0;
         }
@@ -457,12 +478,12 @@ int main(int argc, char **argv)
     for(;;) {
         /* compute current audio and video time */
         if (audio_st)
-            audio_pts = (double)audio_st->pts.val * oc->pts_num / oc->pts_den;
+            audio_pts = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
         else
             audio_pts = 0.0;
         
         if (video_st)
-            video_pts = (double)video_st->pts.val * oc->pts_num / oc->pts_den;
+            video_pts = (double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
         else
             video_pts = 0.0;