FFmpeg
pktdumper.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2005 Francois Revol
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
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  * 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.
15  *
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
19  */
20 
21 #include "config.h"
22 #include <limits.h>
23 #include <fcntl.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #if HAVE_UNISTD_H
28 #include <unistd.h>
29 #endif
30 #if HAVE_IO_H
31 #include <io.h>
32 #endif
33 
34 #include "libavutil/avstring.h"
35 #include "libavutil/time.h"
36 #include "libavformat/avformat.h"
37 
38 #define FILENAME_BUF_SIZE 4096
39 #define PKTFILESUFF "_%08" PRId64 "_%02d_%010" PRId64 "_%06d_%c.bin"
40 #define EXTRADATAFILESUFF "_extradata_%02d_%06d.bin"
41 
42 static int usage(int ret)
43 {
44  fprintf(stderr, "Dump (up to maxpkts) AVPackets as they are demuxed by libavformat.\n");
45  fprintf(stderr, "Each packet is dumped in its own file named like\n");
46  fprintf(stderr, "$(basename file.ext)_$PKTNUM_$STREAMINDEX_$STAMP_$SIZE_$FLAGS.bin\n");
47  fprintf(stderr, "pktdumper [-nw] file [maxpkts]\n");
48  fprintf(stderr, "-n\twrite No file at all, only demux.\n");
49  fprintf(stderr, "-w\tWait at end of processing instead of quitting.\n");
50  return ret;
51 }
52 
53 int main(int argc, char **argv)
54 {
55  char fntemplate[FILENAME_BUF_SIZE];
56  char fntemplate2[FILENAME_BUF_SIZE];
57  char pktfilename[FILENAME_BUF_SIZE];
58  AVFormatContext *fctx = NULL;
59  AVPacket *pkt;
60  int64_t pktnum = 0;
61  int64_t maxpkts = 0;
62  int donotquit = 0;
63  int nowrite = 0;
64  int err;
65 
66  if ((argc > 1) && !strncmp(argv[1], "-", 1)) {
67  if (strchr(argv[1], 'w'))
68  donotquit = 1;
69  if (strchr(argv[1], 'n'))
70  nowrite = 1;
71  argv++;
72  argc--;
73  }
74  if (argc < 2)
75  return usage(1);
76  if (argc > 2)
77  maxpkts = atoi(argv[2]);
78  av_strlcpy(fntemplate, argv[1], sizeof(fntemplate));
79  if (strrchr(argv[1], '/'))
80  av_strlcpy(fntemplate, strrchr(argv[1], '/') + 1, sizeof(fntemplate));
81  if (strrchr(fntemplate, '.'))
82  *strrchr(fntemplate, '.') = '\0';
83  if (strchr(fntemplate, '%')) {
84  fprintf(stderr, "cannot use filenames containing '%%'\n");
85  return usage(1);
86  }
87  if (strlen(fntemplate) + sizeof(PKTFILESUFF) >= sizeof(fntemplate) - 1) {
88  fprintf(stderr, "filename too long\n");
89  return usage(1);
90  }
91 
92  err = avformat_open_input(&fctx, argv[1], NULL, NULL);
93  if (err < 0) {
94  fprintf(stderr, "cannot open input: error %d\n", err);
95  return 1;
96  }
97 
98  err = avformat_find_stream_info(fctx, NULL);
99  if (err < 0) {
100  fprintf(stderr, "avformat_find_stream_info: error %d\n", err);
101  return 1;
102  }
103 
104  pkt = av_packet_alloc();
105  if (!pkt) {
106  fprintf(stderr, "av_packet_alloc: error %d\n", AVERROR(ENOMEM));
107  return 1;
108  }
109 
110  strcpy(fntemplate2, fntemplate);
111  strcat(fntemplate2, EXTRADATAFILESUFF);
112 
113  for (int i = 0; i < fctx->nb_streams; i++) {
114  AVCodecParameters * par = fctx->streams[i]->codecpar;
115  int fd;
116  if (par->extradata_size) {
117  snprintf(pktfilename, sizeof(pktfilename), fntemplate2, i, par->extradata_size);
119  if (!nowrite) {
120  fd = open(pktfilename, O_WRONLY | O_CREAT, 0644);
121  err = write(fd, par->extradata, par->extradata_size);
122  if (err < 0) {
123  fprintf(stderr, "write: error %d\n", err);
124  return 1;
125  }
126  close(fd);
127  }
128  }
129  }
130 
131  strcat(fntemplate, PKTFILESUFF);
132  printf("FNTEMPLATE: '%s'\n", fntemplate);
133 
134  while ((err = av_read_frame(fctx, pkt)) >= 0) {
135  int fd;
136  snprintf(pktfilename, sizeof(pktfilename), fntemplate, pktnum,
138  (pkt->flags & AV_PKT_FLAG_KEY) ? 'K' : '_');
139  printf(PKTFILESUFF "\n", pktnum, pkt->stream_index, pkt->pts, pkt->size,
140  (pkt->flags & AV_PKT_FLAG_KEY) ? 'K' : '_');
141  if (!nowrite) {
142  fd = open(pktfilename, O_WRONLY | O_CREAT, 0644);
143  err = write(fd, pkt->data, pkt->size);
144  if (err < 0) {
145  fprintf(stderr, "write: error %d\n", err);
146  return 1;
147  }
148  close(fd);
149  }
151  pktnum++;
152  if (maxpkts && (pktnum >= maxpkts))
153  break;
154  }
155 
157  avformat_close_input(&fctx);
158 
159  while (donotquit)
160  av_usleep(60 * 1000000);
161 
162  return 0;
163 }
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:431
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
printf
__device__ int printf(const char *,...)
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
int64_t
long long int64_t
Definition: coverity.c:34
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1332
AVPacket::data
uint8_t * data
Definition: packet.h:546
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: demux.c:1534
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:601
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: packet.c:75
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:135
avformat_close_input
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
Definition: demux.c:367
pkt
AVPacket * pkt
Definition: movenc.c:60
avformat_open_input
int avformat_open_input(AVFormatContext **ps, const char *url, const AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
Definition: demux.c:217
limits.h
av_usleep
int av_usleep(unsigned usec)
Sleep for a period of time.
Definition: time.c:84
AVFormatContext
Format I/O context.
Definition: avformat.h:1264
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
FILENAME_BUF_SIZE
#define FILENAME_BUF_SIZE
Definition: pktdumper.c:38
NULL
#define NULL
Definition: coverity.c:32
time.h
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1320
avformat_find_stream_info
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
Read packets of a media file to get stream information.
Definition: demux.c:2512
AVPacket::size
int size
Definition: packet.h:547
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:552
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:64
usage
static int usage(int ret)
Definition: pktdumper.c:42
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:539
ret
ret
Definition: filter_design.txt:187
avformat.h
AVPacket::stream_index
int stream_index
Definition: packet.h:548
main
int main(int argc, char **argv)
Definition: pktdumper.c:53
AVPacket
This structure stores compressed data.
Definition: packet.h:523
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:85
avstring.h
snprintf
#define snprintf
Definition: snprintf.h:34
EXTRADATAFILESUFF
#define EXTRADATAFILESUFF
Definition: pktdumper.c:40
PKTFILESUFF
#define PKTFILESUFF
Definition: pktdumper.c:39