1b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian/*
2b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *
4b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
5b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
6b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
7b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  in the file PATENTS.  All contributing project authors may
8b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
9b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian */
10b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
11b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "./webmdec.h"
12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <stdarg.h>
14b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "third_party/nestegg/include/nestegg/nestegg.h"
16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int nestegg_read_cb(void *buffer, size_t length, void *userdata) {
18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  FILE *f = userdata;
19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (fread(buffer, 1, length, f) < length) {
21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (ferror(f))
22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      return -1;
23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (feof(f))
24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      return 0;
25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return 1;
27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int nestegg_seek_cb(int64_t offset, int whence, void *userdata) {
30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  switch (whence) {
31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    case NESTEGG_SEEK_SET:
32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      whence = SEEK_SET;
33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      break;
34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    case NESTEGG_SEEK_CUR:
35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      whence = SEEK_CUR;
36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      break;
37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    case NESTEGG_SEEK_END:
38b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      whence = SEEK_END;
39b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      break;
40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  };
41b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return fseek(userdata, (int32_t)offset, whence) ? -1 : 0;
42b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
43b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int64_t nestegg_tell_cb(void *userdata) {
45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return ftell(userdata);
46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
47b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void nestegg_log_cb(nestegg *context,
49b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                           unsigned int severity,
50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                           char const *format, ...) {
51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  va_list ap;
52b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  va_start(ap, format);
53b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vfprintf(stderr, format, ap);
54b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  fprintf(stderr, "\n");
55b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  va_end(ap);
56b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
58b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint file_is_webm(struct WebmInputContext *webm_ctx,
59b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                 struct VpxInputContext *vpx_ctx) {
60b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint32_t i, n;
61b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int track_type = -1;
62b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  int codec_id;
63b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  nestegg_io io = {nestegg_read_cb, nestegg_seek_cb, nestegg_tell_cb, 0};
65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  nestegg_video_params params;
66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  io.userdata = vpx_ctx->file;
68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (nestegg_init(&webm_ctx->nestegg_ctx, io, NULL, -1))
69b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    goto fail;
70b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (nestegg_track_count(webm_ctx->nestegg_ctx, &n))
72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    goto fail;
73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; i < n; i++) {
75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    track_type = nestegg_track_type(webm_ctx->nestegg_ctx, i);
76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
77b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (track_type == NESTEGG_TRACK_VIDEO)
78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      break;
79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    else if (track_type < 0)
80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      goto fail;
81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  codec_id = nestegg_track_codec_id(webm_ctx->nestegg_ctx, i);
84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (codec_id == NESTEGG_CODEC_VP8) {
85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_ctx->fourcc = VP8_FOURCC;
86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else if (codec_id == NESTEGG_CODEC_VP9) {
87b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_ctx->fourcc = VP9_FOURCC;
88b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  } else {
89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    fatal("Not VPx video, quitting.\n");
90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
92b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  webm_ctx->video_track = i;
93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
94b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (nestegg_track_video_params(webm_ctx->nestegg_ctx, i, &params))
95b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    goto fail;
96b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
97b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_ctx->framerate.denominator = 0;
98b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_ctx->framerate.numerator = 0;
99b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_ctx->width = params.width;
100b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_ctx->height = params.height;
101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
102b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return 1;
103b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
104b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fail:
105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  webm_ctx->nestegg_ctx = NULL;
106b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  rewind(vpx_ctx->file);
107b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
108b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return 0;
109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
110b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
111b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint webm_read_frame(struct WebmInputContext *webm_ctx,
112b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    uint8_t **buffer,
113b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    size_t *bytes_in_buffer,
114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                    size_t *buffer_size) {
115b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (webm_ctx->chunk >= webm_ctx->chunks) {
116b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    uint32_t track;
117b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
118b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    do {
119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      /* End of this packet, get another. */
120b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      if (webm_ctx->pkt) {
121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        nestegg_free_packet(webm_ctx->pkt);
122b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        webm_ctx->pkt = NULL;
123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
124b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      if (nestegg_read_packet(webm_ctx->nestegg_ctx, &webm_ctx->pkt) <= 0 ||
126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian          nestegg_packet_track(webm_ctx->pkt, &track)) {
127b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian        return 1;
128b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      }
129b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    } while (track != webm_ctx->video_track);
130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
131b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (nestegg_packet_count(webm_ctx->pkt, &webm_ctx->chunks))
132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      return 1;
133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    webm_ctx->chunk = 0;
135b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (nestegg_packet_data(webm_ctx->pkt, webm_ctx->chunk,
138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                          buffer, bytes_in_buffer)) {
139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return 1;
140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
141b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
142b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  webm_ctx->chunk++;
143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return 0;
144b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
145b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
146b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint webm_guess_framerate(struct WebmInputContext *webm_ctx,
147b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian                         struct VpxInputContext *vpx_ctx) {
148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint32_t i;
149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  uint64_t tstamp = 0;
150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
151b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  /* Check to see if we can seek before we parse any data. */
152b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (nestegg_track_seek(webm_ctx->nestegg_ctx, webm_ctx->video_track, 0)) {
153b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    warn("Failed to guess framerate (no Cues), set to 30fps.\n");
154b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_ctx->framerate.numerator = 30;
155b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    vpx_ctx->framerate.denominator  = 1;
156b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    return 0;
157b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
159b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  /* Guess the framerate. Read up to 1 second, or 50 video packets,
160b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   * whichever comes first.
161b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian   */
162b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  for (i = 0; tstamp < 1000000000 && i < 50;) {
163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    nestegg_packet *pkt;
164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    uint32_t track;
165b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
166b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (nestegg_read_packet(webm_ctx->nestegg_ctx, &pkt) <= 0)
167b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      break;
168b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
169b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    nestegg_packet_track(pkt, &track);
170b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (track == webm_ctx->video_track) {
171b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      nestegg_packet_tstamp(pkt, &tstamp);
172b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      ++i;
173b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    }
174b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
175b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    nestegg_free_packet(pkt);
176b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
177b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
178b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (nestegg_track_seek(webm_ctx->nestegg_ctx, webm_ctx->video_track, 0))
179b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    goto fail;
180b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
181b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_ctx->framerate.numerator = (i - 1) * 1000000;
182b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  vpx_ctx->framerate.denominator = (int)(tstamp / 1000);
183b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return 0;
184b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
185b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fail:
186b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  nestegg_destroy(webm_ctx->nestegg_ctx);
187b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  webm_ctx->nestegg_ctx = NULL;
188b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  rewind(vpx_ctx->file);
189b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  return 1;
190b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
191b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
192b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid webm_free(struct WebmInputContext *webm_ctx) {
193b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  if (webm_ctx && webm_ctx->nestegg_ctx) {
194b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    if (webm_ctx->pkt)
195b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      nestegg_free_packet(webm_ctx->pkt);
196b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian    nestegg_destroy(webm_ctx->nestegg_ctx);
197b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian  }
198b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}
199