2 * Copyright (c) 2005 Francois Revol
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
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 GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
34 #include "libavutil/avstring.h"
35 #include "libavutil/time.h"
36 #include "libavformat/avformat.h"
38 #define FILENAME_BUF_SIZE 4096
39 #define PKTFILESUFF "_%08" PRId64 "_%02d_%010" PRId64 "_%06d_%c.bin"
41 static int usage(int ret
)
43 fprintf(stderr
, "Dump (up to maxpkts) AVPackets as they are demuxed by libavformat.\n");
44 fprintf(stderr
, "Each packet is dumped in its own file named like\n");
45 fprintf(stderr
, "$(basename file.ext)_$PKTNUM_$STREAMINDEX_$STAMP_$SIZE_$FLAGS.bin\n");
46 fprintf(stderr
, "pktdumper [-nw] file [maxpkts]\n");
47 fprintf(stderr
, "-n\twrite No file at all, only demux.\n");
48 fprintf(stderr
, "-w\tWait at end of processing instead of quitting.\n");
52 int main(int argc
, char **argv
)
54 char fntemplate
[FILENAME_BUF_SIZE
];
55 char pktfilename
[FILENAME_BUF_SIZE
];
56 AVFormatContext
*fctx
= NULL
;
64 if ((argc
> 1) && !strncmp(argv
[1], "-", 1)) {
65 if (strchr(argv
[1], 'w'))
67 if (strchr(argv
[1], 'n'))
75 maxpkts
= atoi(argv
[2]);
76 av_strlcpy(fntemplate
, argv
[1], sizeof(fntemplate
));
77 if (strrchr(argv
[1], '/'))
78 av_strlcpy(fntemplate
, strrchr(argv
[1], '/') + 1, sizeof(fntemplate
));
79 if (strrchr(fntemplate
, '.'))
80 *strrchr(fntemplate
, '.') = '\0';
81 if (strchr(fntemplate
, '%')) {
82 fprintf(stderr
, "cannot use filenames containing '%%'\n");
85 if (strlen(fntemplate
) + sizeof(PKTFILESUFF
) >= sizeof(fntemplate
) - 1) {
86 fprintf(stderr
, "filename too long\n");
89 strcat(fntemplate
, PKTFILESUFF
);
90 printf("FNTEMPLATE: '%s'\n", fntemplate
);
92 // register all file formats
95 err
= avformat_open_input(&fctx
, argv
[1], NULL
, NULL
);
97 fprintf(stderr
, "cannot open input: error %d\n", err
);
101 err
= avformat_find_stream_info(fctx
, NULL
);
103 fprintf(stderr
, "avformat_find_stream_info: error %d\n", err
);
107 av_init_packet(&pkt
);
109 while ((err
= av_read_frame(fctx
, &pkt
)) >= 0) {
111 snprintf(pktfilename
, sizeof(pktfilename
), fntemplate
, pktnum
,
112 pkt
.stream_index
, pkt
.pts
, pkt
.size
,
113 (pkt
.flags
& AV_PKT_FLAG_KEY
) ? 'K' : '_');
114 printf(PKTFILESUFF
"\n", pktnum
, pkt
.stream_index
, pkt
.pts
, pkt
.size
,
115 (pkt
.flags
& AV_PKT_FLAG_KEY
) ? 'K' : '_');
117 fd
= open(pktfilename
, O_WRONLY
| O_CREAT
, 0644);
118 err
= write(fd
, pkt
.data
, pkt
.size
);
120 fprintf(stderr
, "write: error %d\n", err
);
125 av_free_packet(&pkt
);
127 if (maxpkts
&& (pktnum
>= maxpkts
))
131 avformat_close_input(&fctx
);
134 av_usleep(60 * 1000000);