15ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/*
25ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
35ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *
45ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  Use of this source code is governed by a BSD-style license
55ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  that can be found in the LICENSE file in the root of the source
65ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  tree. An additional intellectual property rights grant can be found
75ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  in the file PATENTS.  All contributing project authors may
85ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  be found in the AUTHORS file in the root of the source tree.
95ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */
105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef WEBMENC_H_
115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define WEBMENC_H_
125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h>
145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdlib.h>
155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(_MSC_VER)
175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/* MSVS doesn't define off_t */
185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef __int64 off_t;
195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdint.h>
215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "tools_common.h"
245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vpx/vpx_encoder.h"
255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" {
28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef off_t EbmlLoc;
315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct cue_entry {
335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unsigned int time;
345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  uint64_t loc;
355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct EbmlGlobal {
385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int debug;
395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FILE *stream;
415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int64_t last_pts_ms;
425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  vpx_rational_t framerate;
435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  /* These pointers are to the start of an element */
455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  off_t position_reference;
465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  off_t seek_info_pos;
475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  off_t segment_info_pos;
485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  off_t track_pos;
495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  off_t cue_pos;
505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  off_t cluster_pos;
515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  /* This pointer is to a specific element to be serialized */
535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  off_t track_id_pos;
545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  /* These pointers are to the size field of the element */
565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  EbmlLoc startSegment;
575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  EbmlLoc startCluster;
585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  uint32_t cluster_timecode;
605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int cluster_open;
615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct cue_entry *cue_list;
635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unsigned int cues;
645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/* Stereo 3D packed frame format */
675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef enum stereo_format {
685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  STEREO_FORMAT_MONO = 0,
695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  STEREO_FORMAT_LEFT_RIGHT = 1,
705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  STEREO_FORMAT_BOTTOM_TOP = 2,
715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  STEREO_FORMAT_TOP_BOTTOM = 3,
725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  STEREO_FORMAT_RIGHT_LEFT = 11
735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} stereo_format_t;
745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid write_webm_seek_element(struct EbmlGlobal *ebml,
765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             unsigned int id,
775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             off_t pos);
785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid write_webm_file_header(struct EbmlGlobal *glob,
805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            const vpx_codec_enc_cfg_t *cfg,
815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            const struct vpx_rational *fps,
825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            stereo_format_t stereo_fmt,
835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            unsigned int fourcc);
845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid write_webm_block(struct EbmlGlobal *glob,
865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      const vpx_codec_enc_cfg_t *cfg,
875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      const vpx_codec_cx_pkt_t *pkt);
885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid write_webm_file_footer(struct EbmlGlobal *glob, int hash);
905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
92b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}  // extern "C"
93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
94b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // WEBMENC_H_
96