1538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Copyright © 2010 Mozilla Foundation
3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *
4538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * This program is made available under an ISC-style license.  See the
5538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * accompanying file LICENSE for details.
6538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <assert.h>
8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <stdarg.h>
9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <stdio.h>
10538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <stdlib.h>
11538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <stdint.h>
12538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "nestegg/nestegg.h"
13538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
14538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#undef DEBUG
15538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define SEEK_TEST
16538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
17538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic int
18538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstdio_read(void * p, size_t length, void * fp)
19538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
20538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  size_t r;
21538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  r = fread(p, length, 1, fp);
23538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  if (r == 0 && feof(fp))
24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    return 0;
25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  return r == 0 ? -1 : 1;
26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic int
29538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstdio_seek(int64_t offset, int whence, void * fp)
30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  return fseek(fp, offset, whence);
32538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic int64_t
35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstdio_tell(void * fp)
36538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  return ftell(fp);
38538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
39538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic void
41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberlog_callback(nestegg * ctx, unsigned int severity, char const * fmt, ...)
42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  va_list ap;
44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  char const * sev = NULL;
45538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
46538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifndef DEBUG
47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  if (severity < NESTEGG_LOG_WARNING)
48538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    return;
49538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
50538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  switch (severity) {
52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  case NESTEGG_LOG_DEBUG:
53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    sev = "debug:   ";
54538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    break;
55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  case NESTEGG_LOG_WARNING:
56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    sev = "warning: ";
57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    break;
58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  case NESTEGG_LOG_CRITICAL:
59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    sev = "critical:";
60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    break;
61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  default:
62538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    sev = "unknown: ";
63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  }
64538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  fprintf(stderr, "%p %s ", (void *) ctx, sev);
66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  va_start(ap, fmt);
68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  vfprintf(stderr, fmt, ap);
69538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  va_end(ap);
70538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  fprintf(stderr, "\n");
72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberint
75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubermain(int argc, char * argv[])
76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  FILE * fp;
78538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  int r, type;
79538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  nestegg * ctx;
80538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  nestegg_audio_params aparams;
81538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  nestegg_packet * pkt;
82538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  nestegg_video_params vparams;
83538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  size_t length, size;
84538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  uint64_t duration, tstamp, pkt_tstamp;
85538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned char * codec_data, * ptr;
86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int cnt, i, j, track, tracks, pkt_cnt, pkt_track;
87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  unsigned int data_items = 0;
88538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  nestegg_io io = {
89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    stdio_read,
90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    stdio_seek,
91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    stdio_tell,
92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    NULL
93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  };
94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  if (argc != 2)
96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    return EXIT_FAILURE;
97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  fp = fopen(argv[1], "rb");
99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  if (!fp)
100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    return EXIT_FAILURE;
101538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  io.userdata = fp;
103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
104538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  ctx = NULL;
105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  r = nestegg_init(&ctx, io, log_callback);
106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  if (r != 0)
107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    return EXIT_FAILURE;
108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  nestegg_track_count(ctx, &tracks);
110538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  nestegg_duration(ctx, &duration);
111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
112538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  fprintf(stderr, "media has %u tracks and duration %fs\n", tracks, duration / 1e9);
113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  for (i = 0; i < tracks; ++i) {
116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    type = nestegg_track_type(ctx, i);
117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
118538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    fprintf(stderr, "track %u: type: %d codec: %d", i,
119538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            type, nestegg_track_codec_id(ctx, i));
120538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
121538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg_track_codec_data_count(ctx, i, &data_items);
122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (j = 0; j < data_items; ++j) {
123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_track_codec_data(ctx, i, j, &codec_data, &length);
124538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
125538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, " (%p, %u)", codec_data, (unsigned int) length);
126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
127538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
128538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (type == NESTEGG_TRACK_VIDEO) {
129538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_track_video_params(ctx, i, &vparams);
130538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
131538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, " video: %ux%u (d: %ux%u %ux%ux%ux%u)",
132538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber              vparams.width, vparams.height,
133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber              vparams.display_width, vparams.display_height,
134538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber              vparams.crop_top, vparams.crop_left, vparams.crop_bottom, vparams.crop_right);
135538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
136538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    } else if (type == NESTEGG_TRACK_AUDIO) {
137538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_track_audio_params(ctx, i, &aparams);
138538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
139538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, " audio: %.2fhz %u bit %u channels",
140538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber              aparams.rate, aparams.depth, aparams.channels);
141538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
142538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
143538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
144538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    fprintf(stderr, "\n");
145538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
146538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  }
147538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
148538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef SEEK_TEST
149538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
150538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  fprintf(stderr, "seek to middle\n");
151538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
152538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  r = nestegg_track_seek(ctx, 0, duration / 2);
153538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  if (r == 0) {
154538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
155538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    fprintf(stderr, "middle ");
156538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
157538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    r = nestegg_read_packet(ctx, &pkt);
158538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (r == 1) {
159538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_track(pkt, &track);
160538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_count(pkt, &cnt);
161538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_tstamp(pkt, &tstamp);
162538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
163538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, "* t %u pts %f frames %u\n", track, tstamp / 1e9, cnt);
164538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
165538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_free_packet(pkt);
166538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    } else {
167538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
168538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, "middle seek failed\n");
169538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
170538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
171538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  }
172538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
173538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
174538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  fprintf(stderr, "seek to ~end\n");
175538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
176538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  r = nestegg_track_seek(ctx, 0, duration - (duration / 10));
177538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  if (r == 0) {
178538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
179538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    fprintf(stderr, "end ");
180538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
181538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    r = nestegg_read_packet(ctx, &pkt);
182538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (r == 1) {
183538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_track(pkt, &track);
184538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_count(pkt, &cnt);
185538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_tstamp(pkt, &tstamp);
186538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
187538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, "* t %u pts %f frames %u\n", track, tstamp / 1e9, cnt);
188538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
189538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_free_packet(pkt);
190538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    } else {
191538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
192538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, "end seek failed\n");
193538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
194538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
195538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  }
196538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
197538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
198538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  fprintf(stderr, "seek to ~start\n");
199538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
200538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  r = nestegg_track_seek(ctx, 0, duration / 10);
201538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  if (r == 0) {
202538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
203538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    fprintf(stderr, "start ");
204538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
205538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    r = nestegg_read_packet(ctx, &pkt);
206538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (r == 1) {
207538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_track(pkt, &track);
208538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_count(pkt, &cnt);
209538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_tstamp(pkt, &tstamp);
210538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
211538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, "* t %u pts %f frames %u\n", track, tstamp / 1e9, cnt);
212538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
213538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_free_packet(pkt);
214538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    } else {
215538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
216538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, "start seek failed\n");
217538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
218538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
219538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  }
220538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
221538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
222538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  while (nestegg_read_packet(ctx, &pkt) > 0) {
223538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg_packet_track(pkt, &pkt_track);
224538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg_packet_count(pkt, &pkt_cnt);
225538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg_packet_tstamp(pkt, &pkt_tstamp);
226538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
227538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
228538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    fprintf(stderr, "t %u pts %f frames %u: ", pkt_track, pkt_tstamp / 1e9, pkt_cnt);
229538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
230538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
231538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < pkt_cnt; ++i) {
232538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      nestegg_packet_data(pkt, i, &ptr, &size);
233538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
234538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber      fprintf(stderr, "%u ", (unsigned int) size);
235538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
236538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
237538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifdef DEBUG
238538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    fprintf(stderr, "\n");
239538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
240538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
241538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    nestegg_free_packet(pkt);
242538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  }
243538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
244538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  nestegg_destroy(ctx);
245538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  fclose(fp);
246538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
247538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber  return EXIT_SUCCESS;
248538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
249