1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2005 Francois Revol
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#include "config.h"
22cabdff1aSopenharmony_ci#include <limits.h>
23cabdff1aSopenharmony_ci#include <fcntl.h>
24cabdff1aSopenharmony_ci#include <stdio.h>
25cabdff1aSopenharmony_ci#include <stdlib.h>
26cabdff1aSopenharmony_ci#include <string.h>
27cabdff1aSopenharmony_ci#if HAVE_UNISTD_H
28cabdff1aSopenharmony_ci#include <unistd.h>
29cabdff1aSopenharmony_ci#endif
30cabdff1aSopenharmony_ci#if HAVE_IO_H
31cabdff1aSopenharmony_ci#include <io.h>
32cabdff1aSopenharmony_ci#endif
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci#include "libavutil/avstring.h"
35cabdff1aSopenharmony_ci#include "libavutil/time.h"
36cabdff1aSopenharmony_ci#include "libavformat/avformat.h"
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#define FILENAME_BUF_SIZE 4096
39cabdff1aSopenharmony_ci#define PKTFILESUFF "_%08" PRId64 "_%02d_%010" PRId64 "_%06d_%c.bin"
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_cistatic int usage(int ret)
42cabdff1aSopenharmony_ci{
43cabdff1aSopenharmony_ci    fprintf(stderr, "Dump (up to maxpkts) AVPackets as they are demuxed by libavformat.\n");
44cabdff1aSopenharmony_ci    fprintf(stderr, "Each packet is dumped in its own file named like\n");
45cabdff1aSopenharmony_ci    fprintf(stderr, "$(basename file.ext)_$PKTNUM_$STREAMINDEX_$STAMP_$SIZE_$FLAGS.bin\n");
46cabdff1aSopenharmony_ci    fprintf(stderr, "pktdumper [-nw] file [maxpkts]\n");
47cabdff1aSopenharmony_ci    fprintf(stderr, "-n\twrite No file at all, only demux.\n");
48cabdff1aSopenharmony_ci    fprintf(stderr, "-w\tWait at end of processing instead of quitting.\n");
49cabdff1aSopenharmony_ci    return ret;
50cabdff1aSopenharmony_ci}
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_ciint main(int argc, char **argv)
53cabdff1aSopenharmony_ci{
54cabdff1aSopenharmony_ci    char fntemplate[FILENAME_BUF_SIZE];
55cabdff1aSopenharmony_ci    char pktfilename[FILENAME_BUF_SIZE];
56cabdff1aSopenharmony_ci    AVFormatContext *fctx = NULL;
57cabdff1aSopenharmony_ci    AVPacket *pkt;
58cabdff1aSopenharmony_ci    int64_t pktnum  = 0;
59cabdff1aSopenharmony_ci    int64_t maxpkts = 0;
60cabdff1aSopenharmony_ci    int donotquit   = 0;
61cabdff1aSopenharmony_ci    int nowrite     = 0;
62cabdff1aSopenharmony_ci    int err;
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_ci    if ((argc > 1) && !strncmp(argv[1], "-", 1)) {
65cabdff1aSopenharmony_ci        if (strchr(argv[1], 'w'))
66cabdff1aSopenharmony_ci            donotquit = 1;
67cabdff1aSopenharmony_ci        if (strchr(argv[1], 'n'))
68cabdff1aSopenharmony_ci            nowrite = 1;
69cabdff1aSopenharmony_ci        argv++;
70cabdff1aSopenharmony_ci        argc--;
71cabdff1aSopenharmony_ci    }
72cabdff1aSopenharmony_ci    if (argc < 2)
73cabdff1aSopenharmony_ci        return usage(1);
74cabdff1aSopenharmony_ci    if (argc > 2)
75cabdff1aSopenharmony_ci        maxpkts = atoi(argv[2]);
76cabdff1aSopenharmony_ci    av_strlcpy(fntemplate, argv[1], sizeof(fntemplate));
77cabdff1aSopenharmony_ci    if (strrchr(argv[1], '/'))
78cabdff1aSopenharmony_ci        av_strlcpy(fntemplate, strrchr(argv[1], '/') + 1, sizeof(fntemplate));
79cabdff1aSopenharmony_ci    if (strrchr(fntemplate, '.'))
80cabdff1aSopenharmony_ci        *strrchr(fntemplate, '.') = '\0';
81cabdff1aSopenharmony_ci    if (strchr(fntemplate, '%')) {
82cabdff1aSopenharmony_ci        fprintf(stderr, "cannot use filenames containing '%%'\n");
83cabdff1aSopenharmony_ci        return usage(1);
84cabdff1aSopenharmony_ci    }
85cabdff1aSopenharmony_ci    if (strlen(fntemplate) + sizeof(PKTFILESUFF) >= sizeof(fntemplate) - 1) {
86cabdff1aSopenharmony_ci        fprintf(stderr, "filename too long\n");
87cabdff1aSopenharmony_ci        return usage(1);
88cabdff1aSopenharmony_ci    }
89cabdff1aSopenharmony_ci    strcat(fntemplate, PKTFILESUFF);
90cabdff1aSopenharmony_ci    printf("FNTEMPLATE: '%s'\n", fntemplate);
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_ci    err = avformat_open_input(&fctx, argv[1], NULL, NULL);
93cabdff1aSopenharmony_ci    if (err < 0) {
94cabdff1aSopenharmony_ci        fprintf(stderr, "cannot open input: error %d\n", err);
95cabdff1aSopenharmony_ci        return 1;
96cabdff1aSopenharmony_ci    }
97cabdff1aSopenharmony_ci
98cabdff1aSopenharmony_ci    err = avformat_find_stream_info(fctx, NULL);
99cabdff1aSopenharmony_ci    if (err < 0) {
100cabdff1aSopenharmony_ci        fprintf(stderr, "avformat_find_stream_info: error %d\n", err);
101cabdff1aSopenharmony_ci        return 1;
102cabdff1aSopenharmony_ci    }
103cabdff1aSopenharmony_ci
104cabdff1aSopenharmony_ci    pkt = av_packet_alloc();
105cabdff1aSopenharmony_ci    if (!pkt) {
106cabdff1aSopenharmony_ci        fprintf(stderr, "av_packet_alloc: error %d\n", AVERROR(ENOMEM));
107cabdff1aSopenharmony_ci        return 1;
108cabdff1aSopenharmony_ci    }
109cabdff1aSopenharmony_ci
110cabdff1aSopenharmony_ci    while ((err = av_read_frame(fctx, pkt)) >= 0) {
111cabdff1aSopenharmony_ci        int fd;
112cabdff1aSopenharmony_ci        snprintf(pktfilename, sizeof(pktfilename), fntemplate, pktnum,
113cabdff1aSopenharmony_ci                 pkt->stream_index, pkt->pts, pkt->size,
114cabdff1aSopenharmony_ci                 (pkt->flags & AV_PKT_FLAG_KEY) ? 'K' : '_');
115cabdff1aSopenharmony_ci        printf(PKTFILESUFF "\n", pktnum, pkt->stream_index, pkt->pts, pkt->size,
116cabdff1aSopenharmony_ci               (pkt->flags & AV_PKT_FLAG_KEY) ? 'K' : '_');
117cabdff1aSopenharmony_ci        if (!nowrite) {
118cabdff1aSopenharmony_ci            fd  = open(pktfilename, O_WRONLY | O_CREAT, 0644);
119cabdff1aSopenharmony_ci            err = write(fd, pkt->data, pkt->size);
120cabdff1aSopenharmony_ci            if (err < 0) {
121cabdff1aSopenharmony_ci                fprintf(stderr, "write: error %d\n", err);
122cabdff1aSopenharmony_ci                return 1;
123cabdff1aSopenharmony_ci            }
124cabdff1aSopenharmony_ci            close(fd);
125cabdff1aSopenharmony_ci        }
126cabdff1aSopenharmony_ci        av_packet_unref(pkt);
127cabdff1aSopenharmony_ci        pktnum++;
128cabdff1aSopenharmony_ci        if (maxpkts && (pktnum >= maxpkts))
129cabdff1aSopenharmony_ci            break;
130cabdff1aSopenharmony_ci    }
131cabdff1aSopenharmony_ci
132cabdff1aSopenharmony_ci    av_packet_free(&pkt);
133cabdff1aSopenharmony_ci    avformat_close_input(&fctx);
134cabdff1aSopenharmony_ci
135cabdff1aSopenharmony_ci    while (donotquit)
136cabdff1aSopenharmony_ci        av_usleep(60 * 1000000);
137cabdff1aSopenharmony_ci
138cabdff1aSopenharmony_ci    return 0;
139cabdff1aSopenharmony_ci}
140