[FFmpeg-soc] [soc]: r4610 - in concat: ffmpeg.c.diff libavformat/allformats.c.diff libavformat/concat.c libavformat/concat.h libavformat/m3u.c

gkovacs subversion at mplayerhq.hu
Sun Jul 5 08:05:04 CEST 2009


Author: gkovacs
Date: Sun Jul  5 08:05:04 2009
New Revision: 4610

Log:
added ffmpeg conc option to concatenate input files

Modified:
   concat/ffmpeg.c.diff
   concat/libavformat/allformats.c.diff
   concat/libavformat/concat.c
   concat/libavformat/concat.h
   concat/libavformat/m3u.c

Modified: concat/ffmpeg.c.diff
==============================================================================
--- concat/ffmpeg.c.diff	Sun Jul  5 08:04:45 2009	(r4609)
+++ concat/ffmpeg.c.diff	Sun Jul  5 08:05:04 2009	(r4610)
@@ -1,8 +1,28 @@
 diff --git a/ffmpeg.c b/ffmpeg.c
-index 22bfed8..ec47a05 100644
+index 22bfed8..d7294c3 100644
 --- a/ffmpeg.c
 +++ b/ffmpeg.c
-@@ -1237,7 +1237,8 @@ static void print_report(AVFormatContext **output_files,
+@@ -70,6 +70,8 @@
+ 
+ #undef exit
+ 
++#include "libavformat/concat.h"
++
+ const char program_name[] = "FFmpeg";
+ const int program_birth_year = 2000;
+ 
+@@ -223,6 +225,10 @@ static unsigned int sws_flags = SWS_BICUBIC;
+ 
+ static int64_t timer_start;
+ 
++static int concatenate_video_files;
++
++PlaylistContext *playlist_ctx;
++
+ static uint8_t *audio_buf;
+ static uint8_t *audio_out;
+ static uint8_t *audio_out2;
+@@ -1237,7 +1243,8 @@ static void print_report(AVFormatContext **output_files,
  /* pkt = NULL means EOF (needed to flush decoder buffers) */
  static int output_packet(AVInputStream *ist, int ist_index,
                           AVOutputStream **ost_table, int nb_ostreams,
@@ -12,7 +32,7 @@ index 22bfed8..ec47a05 100644
  {
      AVFormatContext *os;
      AVOutputStream *ost;
-@@ -1250,6 +1251,23 @@ static int output_packet(AVInputStream *ist, int ist_index,
+@@ -1250,6 +1257,23 @@ static int output_packet(AVInputStream *ist, int ist_index,
      AVSubtitle subtitle, *subtitle_to_free;
      int got_subtitle;
      AVPacket avpkt;
@@ -36,7 +56,7 @@ index 22bfed8..ec47a05 100644
  
      if(ist->next_pts == AV_NOPTS_VALUE)
          ist->next_pts= ist->pts;
-@@ -1292,8 +1310,10 @@ static int output_packet(AVInputStream *ist, int ist_index,
+@@ -1292,8 +1316,10 @@ static int output_packet(AVInputStream *ist, int ist_index,
                         endianness as CPU */
                  ret = avcodec_decode_audio3(ist->st->codec, samples, &data_size,
                                              &avpkt);
@@ -48,7 +68,7 @@ index 22bfed8..ec47a05 100644
                  avpkt.data += ret;
                  avpkt.size -= ret;
                  /* Some bug in mpeg audio decoder gives */
-@@ -1314,9 +1334,12 @@ static int output_packet(AVInputStream *ist, int ist_index,
+@@ -1314,9 +1340,12 @@ static int output_packet(AVInputStream *ist, int ist_index,
                      ret = avcodec_decode_video2(ist->st->codec,
                                                  &picture, &got_picture, &avpkt);
                      ist->st->quality= picture.quality;
@@ -62,7 +82,7 @@ index 22bfed8..ec47a05 100644
                          /* no picture yet */
                          goto discard_packet;
                      }
-@@ -1331,8 +1354,10 @@ static int output_packet(AVInputStream *ist, int ist_index,
+@@ -1331,8 +1360,10 @@ static int output_packet(AVInputStream *ist, int ist_index,
              case CODEC_TYPE_SUBTITLE:
                  ret = avcodec_decode_subtitle2(ist->st->codec,
                                                 &subtitle, &got_subtitle, &avpkt);
@@ -74,7 +94,15 @@ index 22bfed8..ec47a05 100644
                  if (!got_subtitle) {
                      goto discard_packet;
                  }
-@@ -2278,8 +2303,9 @@ static int av_encode(AVFormatContext **output_files,
+@@ -1644,6 +1675,7 @@ static int av_encode(AVFormatContext **output_files,
+     uint8_t no_packet[MAX_FILES]={0};
+     int no_packet_count=0;
+ 
++
+     file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
+     if (!file_table)
+         goto fail;
+@@ -2278,8 +2310,9 @@ static int av_encode(AVFormatContext **output_files,
          }
  
          //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
@@ -86,7 +114,7 @@ index 22bfed8..ec47a05 100644
              if (verbose >= 0)
                  fprintf(stderr, "Error while decoding stream #%d.%d\n",
                          ist->file_index, ist->index);
-@@ -2300,7 +2326,7 @@ static int av_encode(AVFormatContext **output_files,
+@@ -2300,7 +2333,7 @@ static int av_encode(AVFormatContext **output_files,
      for(i=0;i<nb_istreams;i++) {
          ist = ist_table[i];
          if (ist->decoding_needed) {
@@ -95,3 +123,36 @@ index 22bfed8..ec47a05 100644
          }
      }
  
+@@ -2848,6 +2881,7 @@ static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
+ 
+ static void opt_input_file(const char *filename)
+ {
++
+     AVFormatContext *ic;
+     AVFormatParameters params, *ap = &params;
+     int err, i, ret, rfps, rfps_base;
+@@ -2859,6 +2893,16 @@ static void opt_input_file(const char *filename)
+     using_stdin |= !strncmp(filename, "pipe:", 5) ||
+                     !strcmp(filename, "/dev/stdin");
+ 
++    if (concatenate_video_files) { // need to specify -conc before -i
++        if (!playlist_ctx) {
++            printf("need to generate playlist ctx\n");
++            playlist_ctx = ff_playlist_make_context(filename);
++            nb_input_files = 1;
++            input_files[nb_input_files] = ic;
++        }
++        return;
++    }
++
+     /* get default parameters from command line */
+     ic = avformat_alloc_context();
+ 
+@@ -3874,6 +3918,7 @@ static const OptionDef options[] = {
+     { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
+     { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
+     { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)&copy_initial_nonkeyframes}, "copy initial non-keyframes" },
++    { "conc", OPT_BOOL, {(void*)&concatenate_video_files}, "concatenate video files", "concatenate" },
+ 
+     /* video options */
+     { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },

Modified: concat/libavformat/allformats.c.diff
==============================================================================
--- concat/libavformat/allformats.c.diff	Sun Jul  5 08:04:45 2009	(r4609)
+++ concat/libavformat/allformats.c.diff	Sun Jul  5 08:05:04 2009	(r4610)
@@ -1,13 +1,12 @@
 diff --git a/libavformat/allformats.c b/libavformat/allformats.c
-index ad47631..5773fe6 100644
+index ad47631..08a460b 100644
 --- a/libavformat/allformats.c
 +++ b/libavformat/allformats.c
-@@ -66,6 +66,8 @@ void av_register_all(void)
+@@ -66,6 +66,7 @@ void av_register_all(void)
      REGISTER_DEMUXER  (BFI, bfi);
      REGISTER_DEMUXER  (C93, c93);
      REGISTER_DEMUXER  (CAVSVIDEO, cavsvideo);
 +    REGISTER_DEMUXER  (M3U, m3u);
-+    REGISTER_DEMUXER  (CONCAT, concat);
      REGISTER_MUXER    (CRC, crc);
      REGISTER_MUXDEMUX (DAUD, daud);
      REGISTER_MUXDEMUX (DIRAC, dirac);

Modified: concat/libavformat/concat.c
==============================================================================
--- concat/libavformat/concat.c	Sun Jul  5 08:04:45 2009	(r4609)
+++ concat/libavformat/concat.c	Sun Jul  5 08:05:04 2009	(r4610)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "concatgen.h"
+#include "concat.h"
 
 /* The ffmpeg codecs we support, and the IDs they have in the file */
 static const AVCodecTag codec_concat_tags[] = {
@@ -33,14 +33,37 @@ static int concat_probe(AVProbeData *p)
 }
 
 static int concat_read_header(AVFormatContext *s,
-                              AVFormatParameters *ap)
+                       AVFormatParameters *ap)
 {
     // PlaylistD should be constructed externally
     return 0;
 }
 
+AVInputFormat *concat_make_demuxer()
+{
+    AVInputFormat *cdm = av_malloc(sizeof(*cdm));
+    cdm->name = "concat";
+    cdm->long_name = NULL_IF_CONFIG_SMALL("CONCAT format");
+    cdm->priv_data_size = sizeof(PlaylistContext);
+    cdm->read_probe = concat_probe;
+    cdm->read_header = concat_read_header;
+    cdm->read_packet = concatgen_read_packet;
+    cdm->read_close = concatgen_read_close;
+    cdm->read_seek = concatgen_read_seek;
+    cdm->read_timestamp = concatgen_read_timestamp;
+    cdm->flags = NULL;
+    cdm->extensions = NULL;
+    cdm->value = NULL;
+    cdm->read_play = concatgen_read_play;
+    cdm->read_pause = concatgen_read_pause;
+    cdm->codec_tag = codec_concat_tags;
+    cdm->read_seek2 = concatgen_read_seek;
+    cdm->metadata_conv = NULL;
+    cdm->next = NULL;
+    return cdm;
+}
 
-#if CONFIG_CONCAT_DEMUXER
+#if 0
 AVInputFormat concat_demuxer = {
     "concat",
     NULL_IF_CONFIG_SMALL("CONCAT format"),

Modified: concat/libavformat/concat.h
==============================================================================
--- concat/libavformat/concat.h	Sun Jul  5 08:04:45 2009	(r4609)
+++ concat/libavformat/concat.h	Sun Jul  5 08:05:04 2009	(r4610)
@@ -1,2 +1,34 @@
+/*
+ * Standard playlist/concatenation demuxer
+ * Copyright (c) 2009 Geza Kovacs
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "concatgen.h"
+
+#ifndef _CONCAT_H
+#define _CONCAT_H
+
+//int concat_probe(AVProbeData *p);
+
+//int concat_read_header(AVFormatContext *s, AVFormatParameters *ap);
+
+AVInputFormat *concat_make_demuxer();
 
+#endif /* _CONCAT_H */
 

Modified: concat/libavformat/m3u.c
==============================================================================
--- concat/libavformat/m3u.c	Sun Jul  5 08:04:45 2009	(r4609)
+++ concat/libavformat/m3u.c	Sun Jul  5 08:05:04 2009	(r4610)
@@ -87,8 +87,8 @@ static int m3u_read_header(AVFormatConte
                    &(ctx->flist),
                    &(ctx->pelist_size),
                    ctx->workingdir);
-    ctx->pelist = av_malloc(ctx->pelist_size * sizeof(PlayElem*));
-    memset(ctx->pelist, 0, ctx->pelist_size * sizeof(PlayElem*));
+    ctx->pelist = av_malloc(ctx->pelist_size * sizeof(*(ctx->pelist)));
+    memset(ctx->pelist, 0, ctx->pelist_size * sizeof(*(ctx->pelist)));
     s->priv_data = ctx;
     for (i = 0; i < ctx->pe_curidxs_size; ++i) {
         ff_playlist_populate_context(ctx, s, i);
@@ -100,7 +100,7 @@ static int m3u_read_header(AVFormatConte
 AVInputFormat m3u_demuxer = {
     "m3u",
     NULL_IF_CONFIG_SMALL("M3U format"),
-    0,
+    sizeof(PlaylistContext),
     m3u_probe,
     m3u_read_header,
     concatgen_read_packet,
@@ -113,7 +113,7 @@ AVInputFormat m3u_demuxer = {
     concatgen_read_play,
     concatgen_read_pause,
     (const AVCodecTag* const []){codec_m3u_tags, 0},
-    NULL, //m3u_read_seek2
+    concatgen_read_seek, //m3u_read_seek2
     NULL, //metadata_conv
     NULL, //next
 };


More information about the FFmpeg-soc mailing list