yading@11: /* yading@11: * Copyright (c) 2013 Nicolas George yading@11: * yading@11: * This file is part of FFmpeg. yading@11: * yading@11: * FFmpeg is free software; you can redistribute it and/or yading@11: * modify it under the terms of the GNU Lesser General Public License yading@11: * as published by the Free Software Foundation; either yading@11: * version 2.1 of the License, or (at your option) any later version. yading@11: * yading@11: * FFmpeg is distributed in the hope that it will be useful, yading@11: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the yading@11: * GNU Lesser General Public License for more details. yading@11: * yading@11: * You should have received a copy of the GNU Lesser General Public License yading@11: * along with FFmpeg; if not, write to the Free Software Foundation, Inc., yading@11: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@11: */ yading@11: yading@11: #include yading@11: yading@11: #include "config.h" yading@11: #if HAVE_UNISTD_H yading@11: #include /* getopt */ yading@11: #endif yading@11: yading@11: #include "libavformat/avformat.h" yading@11: #include "libavutil/timestamp.h" yading@11: yading@11: #if !HAVE_GETOPT yading@11: #include "compat/getopt.c" yading@11: #endif yading@11: yading@11: static void usage(int ret) yading@11: { yading@11: fprintf(ret ? stderr : stdout, yading@11: "Usage: seek_print file [command ...]\n" yading@11: "Commands:\n" yading@11: " read\n" yading@11: " seek:stream:min_ts:ts:max_ts:flags\n" yading@11: ); yading@11: exit(ret); yading@11: } yading@11: yading@11: int main(int argc, char **argv) yading@11: { yading@11: int opt, ret, stream, flags; yading@11: const char *filename; yading@11: AVFormatContext *avf = NULL; yading@11: int64_t min_ts, max_ts, ts; yading@11: AVPacket packet; yading@11: yading@11: while ((opt = getopt(argc, argv, "h")) != -1) { yading@11: switch (opt) { yading@11: case 'h': yading@11: usage(0); yading@11: default: yading@11: usage(1); yading@11: } yading@11: } yading@11: argc -= optind; yading@11: argv += optind; yading@11: if (!argc) yading@11: usage(1); yading@11: filename = *argv; yading@11: argv++; yading@11: argc--; yading@11: yading@11: av_register_all(); yading@11: if ((ret = avformat_open_input(&avf, filename, NULL, NULL)) < 0) { yading@11: fprintf(stderr, "%s: %s\n", filename, av_err2str(ret)); yading@11: return 1; yading@11: } yading@11: if ((ret = avformat_find_stream_info(avf, NULL)) < 0) { yading@11: fprintf(stderr, "%s: could not find codec parameters: %s\n", filename, yading@11: av_err2str(ret)); yading@11: return 1; yading@11: } yading@11: yading@11: for (; argc; argc--, argv++) { yading@11: if (!strcmp(*argv, "read")) { yading@11: ret = av_read_frame(avf, &packet); yading@11: if (ret < 0) { yading@11: printf("read: %d (%s)\n", ret, av_err2str(ret)); yading@11: } else { yading@11: AVRational *tb = &avf->streams[packet.stream_index]->time_base; yading@11: printf("read: %d size=%d stream=%d dts=%s (%s) pts=%s (%s)\n", yading@11: ret, packet.size, packet.stream_index, yading@11: av_ts2str(packet.dts), av_ts2timestr(packet.dts, tb), yading@11: av_ts2str(packet.pts), av_ts2timestr(packet.pts, tb)); yading@11: av_free_packet(&packet); yading@11: } yading@11: } else if (sscanf(*argv, "seek:%i:%"SCNi64":%"SCNi64":%"SCNi64":%i", yading@11: &stream, &min_ts, &ts, &max_ts, &flags) == 5) { yading@11: ret = avformat_seek_file(avf, stream, min_ts, ts, max_ts, flags); yading@11: printf("seek: %d (%s)\n", ret, av_err2str(ret)); yading@11: } else { yading@11: fprintf(stderr, "'%s': unknown command\n", *argv); yading@11: return 1; yading@11: } yading@11: } yading@11: yading@11: avformat_close_input(&avf); yading@11: yading@11: return 0; yading@11: }