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, ¶ms)) 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