]> git.sesse.net Git - ffmpeg/blobdiff - output_example.c
altivec workaround
[ffmpeg] / output_example.c
index 2fba8fc6a87cad57054ed4d015c348f5b5a1a830..6f3dcb73795850be34df73c17655ba4b8864f67d 100644 (file)
@@ -142,16 +142,22 @@ 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);
     }
@@ -336,16 +342,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;
         }
@@ -408,7 +430,7 @@ int main(int argc, char **argv)
     }
     
     /* allocate the output media context */
-    oc = av_mallocz(sizeof(AVFormatContext));
+    oc = av_alloc_format_context();
     if (!oc) {
         fprintf(stderr, "Memory error\n");
         exit(1);
@@ -457,12 +479,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;