1/* 2 * Copyright (c) 2005 Francois Revol 3 * 4 * This file is part of Libav. 5 * 6 * Libav 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. 10 * 11 * Libav 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. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with Libav; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#include <limits.h> 22#include <fcntl.h> 23#include <stdio.h> 24#include <stdlib.h> 25#include <string.h> 26#include <unistd.h> 27#include "libavformat/avformat.h" 28 29#define PKTFILESUFF "_%08"PRId64"_%02d_%010"PRId64"_%06d_%c.bin" 30 31#undef strcat 32 33static int usage(int ret) 34{ 35 fprintf(stderr, "dump (up to maxpkts) AVPackets as they are demuxed by libavformat.\n"); 36 fprintf(stderr, "each packet is dumped in its own file named like `basename file.ext`_$PKTNUM_$STREAMINDEX_$STAMP_$SIZE_$FLAGS.bin\n"); 37 fprintf(stderr, "pktdumper [-nw] file [maxpkts]\n"); 38 fprintf(stderr, "-n\twrite No file at all, only demux.\n"); 39 fprintf(stderr, "-w\tWait at end of processing instead of quitting.\n"); 40 return ret; 41} 42 43int main(int argc, char **argv) 44{ 45 char fntemplate[PATH_MAX]; 46 char pktfilename[PATH_MAX]; 47 AVFormatContext *fctx = NULL; 48 AVPacket pkt; 49 int64_t pktnum = 0; 50 int64_t maxpkts = 0; 51 int donotquit = 0; 52 int nowrite = 0; 53 int err; 54 55 if ((argc > 1) && !strncmp(argv[1], "-", 1)) { 56 if (strchr(argv[1], 'w')) 57 donotquit = 1; 58 if (strchr(argv[1], 'n')) 59 nowrite = 1; 60 argv++; 61 argc--; 62 } 63 if (argc < 2) 64 return usage(1); 65 if (argc > 2) 66 maxpkts = atoi(argv[2]); 67 strncpy(fntemplate, argv[1], PATH_MAX-1); 68 if (strrchr(argv[1], '/')) 69 strncpy(fntemplate, strrchr(argv[1], '/')+1, PATH_MAX-1); 70 if (strrchr(fntemplate, '.')) 71 *strrchr(fntemplate, '.') = '\0'; 72 if (strchr(fntemplate, '%')) { 73 fprintf(stderr, "can't use filenames containing '%%'\n"); 74 return usage(1); 75 } 76 if (strlen(fntemplate) + sizeof(PKTFILESUFF) >= PATH_MAX-1) { 77 fprintf(stderr, "filename too long\n"); 78 return usage(1); 79 } 80 strcat(fntemplate, PKTFILESUFF); 81 printf("FNTEMPLATE: '%s'\n", fntemplate); 82 83 // register all file formats 84 av_register_all(); 85 86 err = avformat_open_input(&fctx, argv[1], NULL, NULL); 87 if (err < 0) { 88 fprintf(stderr, "cannot open input: error %d\n", err); 89 return 1; 90 } 91 92 err = avformat_find_stream_info(fctx, NULL); 93 if (err < 0) { 94 fprintf(stderr, "avformat_find_stream_info: error %d\n", err); 95 return 1; 96 } 97 98 av_init_packet(&pkt); 99 100 while ((err = av_read_frame(fctx, &pkt)) >= 0) { 101 int fd; 102 snprintf(pktfilename, PATH_MAX-1, fntemplate, pktnum, pkt.stream_index, pkt.pts, pkt.size, (pkt.flags & AV_PKT_FLAG_KEY)?'K':'_'); 103 printf(PKTFILESUFF"\n", pktnum, pkt.stream_index, pkt.pts, pkt.size, (pkt.flags & AV_PKT_FLAG_KEY)?'K':'_'); 104 //printf("open(\"%s\")\n", pktfilename); 105 if (!nowrite) { 106 fd = open(pktfilename, O_WRONLY|O_CREAT, 0644); 107 err = write(fd, pkt.data, pkt.size); 108 if (err < 0) { 109 fprintf(stderr, "write: error %d\n", err); 110 return 1; 111 } 112 close(fd); 113 } 114 av_free_packet(&pkt); 115 pktnum++; 116 if (maxpkts && (pktnum >= maxpkts)) 117 break; 118 } 119 120 avformat_close_input(&fctx); 121 122 while (donotquit) 123 sleep(60); 124 125 return 0; 126} 127