[FFmpeg-soc] [soc]: r4683 - in concat: ffplay.c.diff libavformat/playlist.c libavformat/playlist.h

gkovacs subversion at mplayerhq.hu
Sun Jul 12 22:23:52 CEST 2009


Author: gkovacs
Date: Sun Jul 12 22:23:52 2009
New Revision: 4683

Log:
removed ffplay audio decode thread dependence on pkt->stream

Modified:
   concat/ffplay.c.diff
   concat/libavformat/playlist.c
   concat/libavformat/playlist.h

Modified: concat/ffplay.c.diff
==============================================================================
--- concat/ffplay.c.diff	Sun Jul 12 21:27:57 2009	(r4682)
+++ concat/ffplay.c.diff	Sun Jul 12 22:23:52 2009	(r4683)
@@ -1,8 +1,17 @@
 diff --git a/ffplay.c b/ffplay.c
-index 5f88a46..4ba6ed0 100644
+index 5f88a46..ca824b7 100644
 --- a/ffplay.c
 +++ b/ffplay.c
-@@ -1336,28 +1336,35 @@ static int video_thread(void *arg)
+@@ -30,6 +30,8 @@
+ #include "libavcodec/colorspace.h"
+ #include "libavcodec/opt.h"
+ 
++#include "libavformat/playlist.h"
++
+ #include "cmdutils.h"
+ 
+ #include <SDL.h>
+@@ -1336,28 +1338,52 @@ static int video_thread(void *arg)
      VideoState *is = arg;
      AVPacket pkt1, *pkt = &pkt1;
      int len1, got_picture;
@@ -10,12 +19,11 @@ index 5f88a46..4ba6ed0 100644
 +    AVFrame *frame;
      double pts;
 -
-+    char isconcat;
++    PlaylistContext *pl_ctx;
++    int st_idx = 0;
++    char tryswitchalready = 0;
 +    frame = avcodec_alloc_frame();
-+    if (!strncmp(is->ic->iformat->long_name, "CONCAT", 6))
-+        isconcat = 1;
-+    else
-+        isconcat = 0;
++    pl_ctx = ff_playlist_get_context(is->ic);
      for(;;) {
          while (is->paused && !is->videoq.abort_request) {
              SDL_Delay(10);
@@ -24,8 +32,7 @@ index 5f88a46..4ba6ed0 100644
          if (packet_queue_get(&is->videoq, pkt, 1) < 0)
              break;
  
-+        if (isconcat && pkt && pkt->stream && pkt->stream->codec && pkt->stream->codec->codec_type == CODEC_TYPE_VIDEO)
-+            is->video_st = pkt->stream;
++        tryagain:
 +
          if(pkt->data == flush_pkt.data){
              avcodec_flush_buffers(is->video_st->codec);
@@ -34,15 +41,33 @@ index 5f88a46..4ba6ed0 100644
 -
          /* NOTE: ipts is the PTS of the _first_ picture beginning in
             this packet, if any */
++
          is->video_st->codec->reordered_opaque= pkt->pts;
++
          len1 = avcodec_decode_video2(is->video_st->codec,
                                      frame, &got_picture,
                                      pkt);
--
+ 
++        if (pl_ctx && pkt && !tryswitchalready) {
++            tryswitchalready = 1;
++//            AVStream *propst = ff_playlist_get_stream(pl_ctx, st_idx+1, pkt->stream_index);
++//            if (propst && propst->codec && propst->codec->codec_type == CODEC_TYPE_VIDEO) {
++//                is->video_st = propst;
++//                ++st_idx;
++//            }
++            if (pkt->stream && pkt->stream->codec && pkt->stream->codec->codec_type == CODEC_TYPE_VIDEO) {
++                if (is->video_st != pkt->stream) {
++                    is->video_st = pkt->stream;
++                    goto tryagain;
++                }
++            }
++        }
++        tryswitchalready = 0;
++
          if(   (decoder_reorder_pts || pkt->dts == AV_NOPTS_VALUE)
             && frame->reordered_opaque != AV_NOPTS_VALUE)
              pts= frame->reordered_opaque;
-@@ -1366,9 +1373,6 @@ static int video_thread(void *arg)
+@@ -1366,9 +1392,6 @@ static int video_thread(void *arg)
          else
              pts= 0;
          pts *= av_q2d(is->video_st->time_base);
@@ -52,7 +77,7 @@ index 5f88a46..4ba6ed0 100644
          if (got_picture) {
              if (output_picture2(is, frame, pts) < 0)
                  goto the_end;
-@@ -1561,50 +1565,66 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
+@@ -1561,50 +1584,63 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
  {
      AVPacket *pkt_temp = &is->audio_pkt_temp;
      AVPacket *pkt = &is->audio_pkt;
@@ -60,12 +85,10 @@ index 5f88a46..4ba6ed0 100644
      int n, len1, data_size;
      double pts;
 -
-+    char isconcat;
++    int st_idx = 0;
++    PlaylistContext *pl_ctx;
 +    char tryswitchalready = 0;
-+    if (!strncmp(is->ic->iformat->long_name, "CONCAT", 6))
-+        isconcat = 1;
-+    else
-+        isconcat = 0;
++    pl_ctx = ff_playlist_get_context(is->ic);
      for(;;) {
 -        /* NOTE: the audio packet can contain several frames */
          while (pkt_temp->size > 0) {
@@ -76,17 +99,16 @@ index 5f88a46..4ba6ed0 100644
                                          (int16_t *)is->audio_buf1, &data_size,
                                          pkt_temp);
              if (len1 < 0) {
-+                if (isconcat) {
-+                    if (pkt->stream && pkt->stream->codec && pkt->stream->codec->codec_type == CODEC_TYPE_AUDIO)
-+                        is->audio_st = pkt->stream;
-+                    else if (pkt_temp->stream && pkt_temp->stream->codec && pkt_temp->stream->codec->codec_type == CODEC_TYPE_AUDIO)
-+                        is->audio_st = pkt_temp->stream;
-+                    else
-+                        is->audio_st = is->ic->streams[pkt->stream_index];
-+                }
                  /* if error, we skip the frame */
                  pkt_temp->size = 0;
-+                if (isconcat && !tryswitchalready) {
++                if (pl_ctx && pkt) {
++                    AVStream *propst = ff_playlist_get_stream(pl_ctx, st_idx+1, pkt->stream_index);
++                    if (propst && propst->codec && propst->codec->codec_type == CODEC_TYPE_AUDIO) {
++                        is->audio_st = propst;
++                        ++st_idx;
++                    }
++                }
++                if (pl_ctx && !tryswitchalready) {
 +                    tryswitchalready = 1;
 +                    goto tryagain;
 +                }
@@ -131,7 +153,7 @@ index 5f88a46..4ba6ed0 100644
                      break;
                  }
                  is->audio_buf= is->audio_buf2;
-@@ -1618,9 +1638,9 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
+@@ -1618,9 +1654,9 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
              /* if no pts, then compute it */
              pts = is->audio_clock;
              *pts_ptr = pts;
@@ -143,7 +165,7 @@ index 5f88a46..4ba6ed0 100644
  #if defined(DEBUG_SYNC)
              {
                  static double last_clock;
-@@ -1632,7 +1652,6 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
+@@ -1632,7 +1668,6 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
  #endif
              return data_size;
          }
@@ -151,7 +173,7 @@ index 5f88a46..4ba6ed0 100644
          /* free the current packet */
          if (pkt->data)
              av_free_packet(pkt);
-@@ -1645,7 +1664,7 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
+@@ -1645,7 +1680,7 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
          if (packet_queue_get(&is->audioq, pkt, 1) < 0)
              return -1;
          if(pkt->data == flush_pkt.data){

Modified: concat/libavformat/playlist.c
==============================================================================
--- concat/libavformat/playlist.c	Sun Jul 12 21:27:57 2009	(r4682)
+++ concat/libavformat/playlist.c	Sun Jul 12 22:23:52 2009	(r4683)
@@ -219,3 +219,22 @@ void ff_playlist_relative_paths(char **f
         ++flist;
     }
 }
+
+PlaylistContext *ff_playlist_get_context(AVFormatContext *ic)
+{
+    if (ic && ic->iformat && ic->iformat->long_name && ic->priv_data &&
+        !strncmp(ic->iformat->long_name, "CONCAT", 6))
+        return ic->priv_data;
+    else
+        return NULL;
+}
+
+AVStream *ff_playlist_get_stream(PlaylistContext *ctx, int pe_idx, int stream_index)
+{
+    if (ctx && pe_idx < ctx->pelist_size && ctx->pelist && ctx->pelist[pe_idx] &&
+        ctx->pelist[pe_idx]->ic && stream_index < ctx->pelist[pe_idx]->ic->nb_streams &&
+        ctx->pelist[pe_idx]->ic->streams && ctx->pelist[pe_idx]->ic->streams[stream_index])
+        return ctx->pelist[pe_idx]->ic->streams[stream_index];
+    else
+        return NULL;
+}

Modified: concat/libavformat/playlist.h
==============================================================================
--- concat/libavformat/playlist.h	Sun Jul 12 21:27:57 2009	(r4682)
+++ concat/libavformat/playlist.h	Sun Jul 12 22:23:52 2009	(r4683)
@@ -63,4 +63,8 @@ int64_t ff_playlist_get_duration(AVForma
 
 void ff_playlist_relative_paths(char **flist, const char *workingdir);
 
+PlaylistContext* ff_playlist_get_context(AVFormatContext *ic);
+
+AVStream *ff_playlist_get_stream(PlaylistContext *ctx, int pe_idx, int stream_index);
+
 #endif /* AVFORMAT_PLAYLIST_H */


More information about the FFmpeg-soc mailing list