webmenc.h 2.27 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#ifndef WEBMENC_H_
#define WEBMENC_H_

#include <stdio.h>
#include <stdlib.h>

#if defined(_MSC_VER)
/* MSVS doesn't define off_t */
typedef __int64 off_t;
#else
#include <stdint.h>
#endif

#include "tools_common.h"
#include "vpx/vpx_encoder.h"

26 27 28 29
#ifdef __cplusplus
extern "C" {
#endif

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
typedef off_t EbmlLoc;

struct cue_entry {
  unsigned int time;
  uint64_t loc;
};

struct EbmlGlobal {
  int debug;

  FILE *stream;
  int64_t last_pts_ms;
  vpx_rational_t framerate;

  /* These pointers are to the start of an element */
  off_t position_reference;
  off_t seek_info_pos;
  off_t segment_info_pos;
  off_t track_pos;
  off_t cue_pos;
  off_t cluster_pos;

  /* This pointer is to a specific element to be serialized */
  off_t track_id_pos;

  /* These pointers are to the size field of the element */
  EbmlLoc startSegment;
  EbmlLoc startCluster;

  uint32_t cluster_timecode;
  int cluster_open;

  struct cue_entry *cue_list;
  unsigned int cues;
};

/* Stereo 3D packed frame format */
typedef enum stereo_format {
68
  STEREO_FORMAT_MONO = 0,
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
  STEREO_FORMAT_LEFT_RIGHT = 1,
  STEREO_FORMAT_BOTTOM_TOP = 2,
  STEREO_FORMAT_TOP_BOTTOM = 3,
  STEREO_FORMAT_RIGHT_LEFT = 11
} stereo_format_t;

void write_webm_seek_element(struct EbmlGlobal *ebml,
                             unsigned int id,
                             off_t pos);

void write_webm_file_header(struct EbmlGlobal *glob,
                            const vpx_codec_enc_cfg_t *cfg,
                            const struct vpx_rational *fps,
                            stereo_format_t stereo_fmt,
                            unsigned int fourcc);

void write_webm_block(struct EbmlGlobal *glob,
                      const vpx_codec_enc_cfg_t *cfg,
                      const vpx_codec_cx_pkt_t *pkt);

void write_webm_file_footer(struct EbmlGlobal *glob, int hash);

91 92 93 94
#ifdef __cplusplus
}  // extern "C"
#endif

95
#endif  // WEBMENC_H_