Libav
oggparseogm.c
Go to the documentation of this file.
1 
25 #include <stdlib.h>
26 
27 #include "libavutil/intreadwrite.h"
28 
29 #include "libavcodec/bytestream.h"
30 
31 #include "avformat.h"
32 #include "internal.h"
33 #include "oggdec.h"
34 #include "riff.h"
35 
36 static int
38 {
39  struct ogg *ogg = s->priv_data;
40  struct ogg_stream *os = ogg->streams + idx;
41  AVStream *st = s->streams[idx];
43  uint64_t time_unit;
44  uint64_t spu;
45 
46  bytestream2_init(&p, os->buf + os->pstart, os->psize);
47  if (!(bytestream2_peek_byte(&p) & 1))
48  return 0;
49 
50  if (bytestream2_peek_byte(&p) == 1) {
51  bytestream2_skip(&p, 1);
52 
53  if (bytestream2_peek_byte(&p) == 'v'){
54  int tag;
56  bytestream2_skip(&p, 8);
57  tag = bytestream2_get_le32(&p);
59  st->codecpar->codec_tag = tag;
60  } else if (bytestream2_peek_byte(&p) == 't') {
63  bytestream2_skip(&p, 12);
64  } else {
65  uint8_t acid[5] = { 0 };
66  int cid;
68  bytestream2_skip(&p, 8);
69  bytestream2_get_buffer(&p, acid, 4);
70  acid[4] = 0;
71  cid = strtol(acid, NULL, 16);
74  }
75 
76  bytestream2_skip(&p, 4); /* useless size field */
77 
78  time_unit = bytestream2_get_le64(&p);
79  spu = bytestream2_get_le64(&p);
80  if (!time_unit || !spu) {
81  av_log(s, AV_LOG_ERROR, "Invalid timing values.\n");
82  return AVERROR_INVALIDDATA;
83  }
84 
85  bytestream2_skip(&p, 4); /* default_len */
86  bytestream2_skip(&p, 8); /* buffersize + bits_per_sample */
87 
89  st->codecpar->width = bytestream2_get_le32(&p);
90  st->codecpar->height = bytestream2_get_le32(&p);
91  avpriv_set_pts_info(st, 64, time_unit, spu * 10000000);
92  } else {
93  st->codecpar->channels = bytestream2_get_le16(&p);
94  bytestream2_skip(&p, 2); /* block_align */
95  st->codecpar->bit_rate = bytestream2_get_le32(&p) * 8;
96  st->codecpar->sample_rate = spu * 10000000 / time_unit;
97  avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
98  }
99  } else if (bytestream2_peek_byte(&p) == 3) {
100  bytestream2_skip(&p, 7);
101  if (bytestream2_get_bytes_left(&p) > 1)
103  }
104 
105  return 1;
106 }
107 
108 static int
110 {
111  struct ogg *ogg = s->priv_data;
112  struct ogg_stream *os = ogg->streams + idx;
113  AVStream *st = s->streams[idx];
114  uint8_t *p = os->buf + os->pstart;
115  uint32_t t;
116 
117  if(!(*p & 1))
118  return 0;
119  if(*p != 1)
120  return 1;
121 
122  t = AV_RL32(p + 96);
123 
124  if(t == 0x05589f80){
127  avpriv_set_pts_info(st, 64, AV_RL64(p + 164), 10000000);
128  st->codecpar->width = AV_RL32(p + 176);
129  st->codecpar->height = AV_RL32(p + 180);
130  } else if(t == 0x05589f81){
133  st->codecpar->channels = AV_RL16(p + 126);
134  st->codecpar->sample_rate = AV_RL32(p + 128);
135  st->codecpar->bit_rate = AV_RL32(p + 132) * 8;
136  }
137 
138  return 1;
139 }
140 
141 static int
143 {
144  struct ogg *ogg = s->priv_data;
145  struct ogg_stream *os = ogg->streams + idx;
146  uint8_t *p = os->buf + os->pstart;
147  int lb;
148 
149  if(*p & 8)
150  os->pflags |= AV_PKT_FLAG_KEY;
151 
152  lb = ((*p & 2) << 1) | ((*p >> 6) & 3);
153  os->pstart += lb + 1;
154  os->psize -= lb + 1;
155 
156  while (lb--)
157  os->pduration += p[lb+1] << (lb*8);
158 
159  return 0;
160 }
161 
163  .magic = "\001video",
164  .magicsize = 6,
165  .header = ogm_header,
166  .packet = ogm_packet,
167  .granule_is_start = 1,
168  .nb_header = 2,
169 };
170 
172  .magic = "\001audio",
173  .magicsize = 6,
174  .header = ogm_header,
175  .packet = ogm_packet,
176  .granule_is_start = 1,
177  .nb_header = 2,
178 };
179 
180 const struct ogg_codec ff_ogm_text_codec = {
181  .magic = "\001text",
182  .magicsize = 5,
183  .header = ogm_header,
184  .packet = ogm_packet,
185  .granule_is_start = 1,
186  .nb_header = 2,
187 };
188 
189 const struct ogg_codec ff_ogm_old_codec = {
190  .magic = "\001Direct Show Samples embedded in Ogg",
191  .magicsize = 35,
192  .header = ogm_dshow_header,
193  .packet = ogm_packet,
194  .granule_is_start = 1,
195  .nb_header = 1,
196 };
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:54
const struct ogg_codec ff_ogm_old_codec
Definition: oggparseogm.c:189
Copyright (C) 2005 Michael Ahlberg, Måns Rullgård.
Definition: oggdec.h:31
unsigned int pflags
Definition: oggdec.h:67
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:1983
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:2986
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: avcodec.h:3483
av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:132
#define AV_RL16
Definition: intreadwrite.h:42
static int ogm_header(AVFormatContext *s, int idx)
Copyright (C) 2005 Michael Ahlberg, Måns Rullgård.
Definition: oggparseogm.c:37
static int ogm_dshow_header(AVFormatContext *s, int idx)
Definition: oggparseogm.c:109
Format I/O context.
Definition: avformat.h:940
#define AV_RL64
Definition: intreadwrite.h:173
unsigned int psize
Definition: oggdec.h:66
uint8_t
int width
Video only.
Definition: avcodec.h:3525
const struct ogg_codec ff_ogm_text_codec
Definition: oggparseogm.c:180
enum AVStreamParseType need_parsing
Definition: avformat.h:879
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1008
const uint8_t * buffer
Definition: bytestream.h:33
uint32_t tag
Definition: movenc.c:854
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1378
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:124
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:161
int ff_vorbis_stream_comment(AVFormatContext *as, AVStream *st, const uint8_t *buf, int size)
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
Definition: bytestream.h:260
enum AVMediaType codec_type
General type of the encoded data.
Definition: avcodec.h:3479
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:151
const AVCodecTag ff_codec_wav_tags[]
Definition: riff.c:374
int bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: avcodec.h:3512
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:29
unsigned int pstart
Definition: oggdec.h:65
internal header for RIFF based (de)muxers do NOT include this in end user applications ...
struct ogg_stream * streams
Definition: oggdec.h:97
#define AV_RL32
Definition: intreadwrite.h:146
const struct ogg_codec ff_ogm_video_codec
Definition: oggparseogm.c:162
Stream structure.
Definition: avformat.h:705
NULL
Definition: eval.c:55
unsigned int pduration
Definition: oggdec.h:68
static int ogm_packet(AVFormatContext *s, int idx)
Definition: oggparseogm.c:142
const int8_t * magic
Definition: oggdec.h:32
int sample_rate
Audio only.
Definition: avcodec.h:3564
uint8_t * buf
Definition: oggdec.h:62
full parsing and repack
Definition: avformat.h:657
Main libavformat public API header.
raw UTF-8 text
Definition: avcodec.h:553
Definition: oggdec.h:96
void * priv_data
Format private data.
Definition: avformat.h:968
int channels
Audio only.
Definition: avcodec.h:3560
AVCodecParameters * codecpar
Definition: avformat.h:831
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: avcodec.h:3487
const struct ogg_codec ff_ogm_audio_codec
Definition: oggparseogm.c:171