12ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/*
22ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
32ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *
42ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
52ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
62ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
72ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *  in the file PATENTS.  All contributing project authors may
82ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
92ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian */
102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifndef WEBMDEC_H_
112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define WEBMDEC_H_
122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./tools_common.h"
142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianextern "C" {
172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct VpxInputContext;
202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct WebmInputContext {
22ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  void *reader;
23ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  void *segment;
24ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint8_t *buffer;
25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  const void *cluster;
26ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  const void *block_entry;
27ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  const void *block;
28ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int block_frame_index;
29ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int video_track_index;
30ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint64_t timestamp_ns;
312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian};
322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
33ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Checks if the input is a WebM file. If so, initializes WebMInputContext so
34ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// that webm_read_frame can be called to retrieve a video frame.
35ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Returns 1 on success and 0 on failure or input is not WebM file.
36ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// TODO(vigneshv): Refactor this function into two smaller functions specific
37ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// to their task.
382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianint file_is_webm(struct WebmInputContext *webm_ctx,
392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                 struct VpxInputContext *vpx_ctx);
402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Reads a WebM Video Frame. Memory for the buffer is created, owned and managed
42ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// by this function. For the first call, |buffer| should be NULL and
43ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// |*bytes_in_buffer| should be 0. Once all the frames are read and used,
44ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// webm_free() should be called, otherwise there will be a leak.
45ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Parameters:
46ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian//      webm_ctx - WebmInputContext object
47ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian//      buffer - pointer where the frame data will be filled.
48ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian//      bytes_in_buffer - pointer to buffer size.
49ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian//      buffer_size - unused TODO(vigneshv): remove this
50ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Return values:
51ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian//      0 - Success
52ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian//      1 - End of Stream
53ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian//     -1 - Error
54ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// TODO(vigneshv): Make the return values consistent across all functions in
55ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// this file.
562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianint webm_read_frame(struct WebmInputContext *webm_ctx,
572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    uint8_t **buffer,
582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    size_t *bytes_in_buffer,
592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    size_t *buffer_size);
602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
61ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Guesses the frame rate of the input file based on the container timestamps.
622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianint webm_guess_framerate(struct WebmInputContext *webm_ctx,
632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                         struct VpxInputContext *vpx_ctx);
642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
65ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Resets the WebMInputContext.
662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid webm_free(struct WebmInputContext *webm_ctx);
672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}  // extern "C"
702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif  // WEBMDEC_H_
73