Blame view

ffmpeg-4.2.2/tools/seek_print.c 3.14 KB
aac5773f   hucm   功能基本完成,接口待打磨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  /*
   * Copyright (c) 2013 Nicolas George
   *
   * 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 "config.h"
  #if HAVE_UNISTD_H
  #include <unistd.h>             /* getopt */
  #endif
  
  #include "libavformat/avformat.h"
  #include "libavutil/timestamp.h"
  
  #if !HAVE_GETOPT
  #include "compat/getopt.c"
  #endif
  
  static void usage(int ret)
  {
      fprintf(ret ? stderr : stdout,
              "Usage: seek_print file [command ...]\n"
              "Commands:\n"
              "    read\n"
              "    seek:stream:min_ts:ts:max_ts:flags\n"
              );
      exit(ret);
  }
  
  int main(int argc, char **argv)
  {
      int opt, ret, stream, flags;
      const char *filename;
      AVFormatContext *avf = NULL;
      int64_t min_ts, max_ts, ts;
      AVPacket packet;
  
      while ((opt = getopt(argc, argv, "h")) != -1) {
          switch (opt) {
          case 'h':
              usage(0);
          default:
              usage(1);
          }
      }
      argc -= optind;
      argv += optind;
      if (!argc)
          usage(1);
      filename = *argv;
      argv++;
      argc--;
  
      if ((ret = avformat_open_input(&avf, filename, NULL, NULL)) < 0) {
          fprintf(stderr, "%s: %s\n", filename, av_err2str(ret));
          return 1;
      }
      if ((ret = avformat_find_stream_info(avf, NULL)) < 0) {
          fprintf(stderr, "%s: could not find codec parameters: %s\n", filename,
                  av_err2str(ret));
          return 1;
      }
  
      for (; argc; argc--, argv++) {
          if (!strcmp(*argv, "read")) {
              ret = av_read_frame(avf, &packet);
              if (ret < 0) {
                  printf("read: %d (%s)\n", ret, av_err2str(ret));
              } else {
                  AVRational *tb = &avf->streams[packet.stream_index]->time_base;
                  printf("read: %d size=%d stream=%d dts=%s (%s) pts=%s (%s)\n",
                         ret, packet.size, packet.stream_index,
                         av_ts2str(packet.dts), av_ts2timestr(packet.dts, tb),
                         av_ts2str(packet.pts), av_ts2timestr(packet.pts, tb));
                  av_packet_unref(&packet);
              }
          } else if (sscanf(*argv, "seek:%i:%"SCNi64":%"SCNi64":%"SCNi64":%i",
                     &stream, &min_ts, &ts, &max_ts, &flags) == 5) {
              ret = avformat_seek_file(avf, stream, min_ts, ts, max_ts, flags);
              printf("seek: %d (%s)\n", ret, av_err2str(ret));
          } else {
              fprintf(stderr, "'%s': unknown command\n", *argv);
              return 1;
          }
      }
  
      avformat_close_input(&avf);
  
      return 0;
  }