Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * Copyright (c) 2013 Nicolas George
3
 *
4
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public License
8
 * as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public License
17
 * along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
18
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
 */
20
 
21
#include "config.h"
22
#if HAVE_UNISTD_H
23
#include              /* getopt */
24
#endif
25
 
26
#include "libavformat/avformat.h"
27
#include "libavutil/timestamp.h"
28
 
29
#if !HAVE_GETOPT
30
#include "compat/getopt.c"
31
#endif
32
 
33
static void usage(int ret)
34
{
35
    fprintf(ret ? stderr : stdout,
36
            "Usage: seek_print file [command ...]\n"
37
            "Commands:\n"
38
            "    read\n"
39
            "    seek:stream:min_ts:ts:max_ts:flags\n"
40
            );
41
    exit(ret);
42
}
43
 
44
int main(int argc, char **argv)
45
{
46
    int opt, ret, stream, flags;
47
    const char *filename;
48
    AVFormatContext *avf = NULL;
49
    int64_t min_ts, max_ts, ts;
50
    AVPacket packet;
51
 
52
    while ((opt = getopt(argc, argv, "h")) != -1) {
53
        switch (opt) {
54
        case 'h':
55
            usage(0);
56
        default:
57
            usage(1);
58
        }
59
    }
60
    argc -= optind;
61
    argv += optind;
62
    if (!argc)
63
        usage(1);
64
    filename = *argv;
65
    argv++;
66
    argc--;
67
 
68
    av_register_all();
69
    if ((ret = avformat_open_input(&avf, filename, NULL, NULL)) < 0) {
70
        fprintf(stderr, "%s: %s\n", filename, av_err2str(ret));
71
        return 1;
72
    }
73
    if ((ret = avformat_find_stream_info(avf, NULL)) < 0) {
74
        fprintf(stderr, "%s: could not find codec parameters: %s\n", filename,
75
                av_err2str(ret));
76
        return 1;
77
    }
78
 
79
    for (; argc; argc--, argv++) {
80
        if (!strcmp(*argv, "read")) {
81
            ret = av_read_frame(avf, &packet);
82
            if (ret < 0) {
83
                printf("read: %d (%s)\n", ret, av_err2str(ret));
84
            } else {
85
                AVRational *tb = &avf->streams[packet.stream_index]->time_base;
86
                printf("read: %d size=%d stream=%d dts=%s (%s) pts=%s (%s)\n",
87
                       ret, packet.size, packet.stream_index,
88
                       av_ts2str(packet.dts), av_ts2timestr(packet.dts, tb),
89
                       av_ts2str(packet.pts), av_ts2timestr(packet.pts, tb));
90
                av_free_packet(&packet);
91
            }
92
        } else if (sscanf(*argv, "seek:%i:%"SCNi64":%"SCNi64":%"SCNi64":%i",
93
                   &stream, &min_ts, &ts, &max_ts, &flags) == 5) {
94
            ret = avformat_seek_file(avf, stream, min_ts, ts, max_ts, flags);
95
            printf("seek: %d (%s)\n", ret, av_err2str(ret));
96
        } else {
97
            fprintf(stderr, "'%s': unknown command\n", *argv);
98
            return 1;
99
        }
100
    }
101
 
102
    avformat_close_input(&avf);
103
 
104
    return 0;
105
}