Merge commit 'f920d089535bf7cf10aeda900cc43201c5e18cd0'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 3 Jul 2014 19:02:56 +0000 (21:02 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 3 Jul 2014 19:02:56 +0000 (21:02 +0200)
* commit 'f920d089535bf7cf10aeda900cc43201c5e18cd0':
  ismindex: Add an option for outputting files elsewhere than in the current directory

Conflicts:
tools/ismindex.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
tools/ismindex.c

diff --combined tools/ismindex.c
@@@ -1,26 -1,26 +1,26 @@@
  /*
   * Copyright (c) 2012 Martin Storsjo
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  /*
   * To create a simple file for smooth streaming:
 - * avconv <normal input/transcoding options> -movflags frag_keyframe foo.ismv
 + * ffmpeg <normal input/transcoding options> -movflags frag_keyframe foo.ismv
   * ismindex -n foo foo.ismv
   * This step creates foo.ism and foo.ismc that is required by IIS for
   * serving it.
   * ismindex -split foo.ismv
   * This step creates a file Manifest and directories QualityLevel(...),
   * that can be read directly by a smooth streaming player.
+  *
+  * The -output dir option can be used to request that output files
+  * (both .ism/.ismc, or Manifest/QualityLevels* when splitting)
+  * should be written to this directory instead of in the current directory.
+  * (The directory itself isn't created if it doesn't already exist.)
   */
  
  #include <stdio.h>
  #include <string.h>
  
 +#include "cmdutils.h"
 +
  #include "libavformat/avformat.h"
  #include "libavformat/os_support.h"
  #include "libavutil/intreadwrite.h"
@@@ -49,7 -52,7 +54,7 @@@
  static int usage(const char *argv0, int ret)
  {
      fprintf(stderr, "%s [-split] [-n basename] [-path-prefix prefix] "
-                     "[-ismc-prefix prefix] file1 [file2] ...\n", argv0);
+                     "[-ismc-prefix prefix] [-output dir] file1 [file2] ...\n", argv0);
      return ret;
  }
  
@@@ -124,17 -127,16 +129,17 @@@ static int write_fragment(const char *f
  }
  
  static int write_fragments(struct Tracks *tracks, int start_index,
-                            AVIOContext *in)
+                            AVIOContext *in, const char *output_prefix)
  {
-     char dirname[100], filename[500];
+     char dirname[2048], filename[2048];
      int i, j;
  
      for (i = start_index; i < tracks->nb_tracks; i++) {
          struct Track *track = tracks->tracks[i];
          const char *type    = track->is_video ? "video" : "audio";
-         snprintf(dirname, sizeof(dirname), "QualityLevels(%d)", track->bitrate);
+         snprintf(dirname, sizeof(dirname), "%sQualityLevels(%d)", output_prefix, track->bitrate);
 -        mkdir(dirname, 0777);
 +        if (mkdir(dirname, 0777) == -1)
 +            return AVERROR(errno);
          for (j = 0; j < track->chunks; j++) {
              snprintf(filename, sizeof(filename), "%s/Fragments(%s=%"PRId64")",
                       dirname, type, track->offsets[j].time);
@@@ -168,7 -170,7 +173,7 @@@ static int read_tfra(struct Tracks *tra
      }
      fieldlength = avio_rb32(f);
      track->chunks  = avio_rb32(f);
 -    track->offsets = av_mallocz(sizeof(*track->offsets) * track->chunks);
 +    track->offsets = av_mallocz_array(track->chunks, sizeof(*track->offsets));
      if (!track->offsets) {
          ret = AVERROR(ENOMEM);
          goto fail;
@@@ -202,7 -204,7 +207,7 @@@ fail
  }
  
  static int read_mfra(struct Tracks *tracks, int start_index,
-                      const char *file, int split)
+                      const char *file, int split, const char *output_prefix)
  {
      int err = 0;
      AVIOContext *f = NULL;
      }
  
      if (split)
-         err = write_fragments(tracks, start_index, f);
 -        write_fragments(tracks, start_index, f, output_prefix);
++        err = write_fragments(tracks, start_index, f, output_prefix);
  
  fail:
      if (f)
@@@ -255,10 -257,7 +260,10 @@@ static int get_video_private_data(struc
      if (codec->codec_id == AV_CODEC_ID_VC1)
          return get_private_data(track, codec);
  
 -    avio_open_dyn_buf(&io);
 +    if (avio_open_dyn_buf(&io) < 0)  {
 +        err = AVERROR(ENOMEM);
 +        goto fail;
 +    }
      if (codec->extradata_size < 11 || codec->extradata[0] != 1)
          goto fail;
      sps_size = AV_RB16(&codec->extradata[6]);
@@@ -278,7 -277,8 +283,8 @@@ fail
      return err;
  }
  
- static int handle_file(struct Tracks *tracks, const char *file, int split)
+ static int handle_file(struct Tracks *tracks, const char *file, int split,
+                        const char *output_prefix)
  {
      AVFormatContext *ctx = NULL;
      int err = 0, i, orig_tracks = tracks->nb_tracks;
  
      avformat_close_input(&ctx);
  
-     err = read_mfra(tracks, orig_tracks, file, split);
+     err = read_mfra(tracks, orig_tracks, file, split, output_prefix);
  
  fail:
      if (ctx)
      return err;
  }
  
- static void output_server_manifest(struct Tracks *tracks,
-                                    const char *basename, const char *path_prefix,
+ static void output_server_manifest(struct Tracks *tracks, const char *basename,
+                                    const char *output_prefix,
+                                    const char *path_prefix,
                                     const char *ismc_prefix)
  {
      char filename[1000];
      FILE *out;
      int i;
  
-     snprintf(filename, sizeof(filename), "%s.ism", basename);
+     snprintf(filename, sizeof(filename), "%s%s.ism", output_prefix, basename);
      out = fopen(filename, "w");
      if (!out) {
          perror(filename);
@@@ -442,17 -443,17 +449,17 @@@ static void print_track_chunks(FILE *ou
      }
  }
  
- static void output_client_manifest(struct Tracks *tracks,
-                                    const char *basename, int split)
+ static void output_client_manifest(struct Tracks *tracks, const char *basename,
+                                    const char *output_prefix, int split)
  {
      char filename[1000];
      FILE *out;
      int i, j;
  
      if (split)
-         snprintf(filename, sizeof(filename), "Manifest");
+         snprintf(filename, sizeof(filename), "%sManifest", output_prefix);
      else
-         snprintf(filename, sizeof(filename), "%s.ismc", basename);
+         snprintf(filename, sizeof(filename), "%s%s.ismc", output_prefix, basename);
      out = fopen(filename, "w");
      if (!out) {
          perror(filename);
@@@ -541,6 -542,8 +548,8 @@@ int main(int argc, char **argv
  {
      const char *basename = NULL;
      const char *path_prefix = "", *ismc_prefix = "";
+     const char *output_prefix = "";
+     char output_prefix_buf[2048];
      int split = 0, i;
      struct Tracks tracks = { 0, .video_track = -1, .audio_track = -1 };
  
          } else if (!strcmp(argv[i], "-ismc-prefix")) {
              ismc_prefix = argv[i + 1];
              i++;
+         } else if (!strcmp(argv[i], "-output")) {
+             output_prefix = argv[i + 1];
+             i++;
+             if (output_prefix[strlen(output_prefix) - 1] != '/') {
+                 snprintf(output_prefix_buf, sizeof(output_prefix_buf),
+                          "%s/", output_prefix);
+                 output_prefix = output_prefix_buf;
+             }
          } else if (!strcmp(argv[i], "-split")) {
              split = 1;
          } else if (argv[i][0] == '-') {
              return usage(argv[0], 1);
          } else {
-             if (handle_file(&tracks, argv[i], split))
+             if (handle_file(&tracks, argv[i], split, output_prefix))
                  return 1;
          }
      }
          return usage(argv[0], 1);
  
      if (!split)
-         output_server_manifest(&tracks, basename, path_prefix, ismc_prefix);
-     output_client_manifest(&tracks, basename, split);
+         output_server_manifest(&tracks, basename, output_prefix,
+                                path_prefix, ismc_prefix);
+     output_client_manifest(&tracks, basename, output_prefix, split);
  
      clean_tracks(&tracks);