2005-04-09 18:32:58 +03:00
|
|
|
/**
|
|
|
|
Copyright (C) 2005 Michael Ahlberg, Måns Rullgård
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person
|
|
|
|
obtaining a copy of this software and associated documentation
|
|
|
|
files (the "Software"), to deal in the Software without
|
|
|
|
restriction, including without limitation the rights to use, copy,
|
|
|
|
modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
|
|
of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
|
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
|
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
DEALINGS IN THE SOFTWARE.
|
|
|
|
**/
|
|
|
|
|
2008-08-31 10:39:47 +03:00
|
|
|
#ifndef AVFORMAT_OGGDEC_H
|
|
|
|
#define AVFORMAT_OGGDEC_H
|
2005-04-09 18:32:58 +03:00
|
|
|
|
|
|
|
#include "avformat.h"
|
2009-06-14 01:45:58 +03:00
|
|
|
#include "metadata.h"
|
2005-04-09 18:32:58 +03:00
|
|
|
|
2008-11-06 03:50:56 +02:00
|
|
|
struct ogg_codec {
|
2008-02-04 14:32:25 +02:00
|
|
|
const int8_t *magic;
|
2005-04-09 18:32:58 +03:00
|
|
|
uint8_t magicsize;
|
2008-02-04 14:32:25 +02:00
|
|
|
const int8_t *name;
|
2009-03-21 10:03:30 +02:00
|
|
|
/**
|
|
|
|
* Attempt to process a packet as a header
|
|
|
|
* @return 1 if the packet was a valid header,
|
|
|
|
* 0 if the packet was not a header (was a data packet)
|
|
|
|
* -1 if an error occurred or for unsupported stream
|
|
|
|
*/
|
2005-04-09 18:32:58 +03:00
|
|
|
int (*header)(AVFormatContext *, int);
|
|
|
|
int (*packet)(AVFormatContext *, int);
|
2010-01-11 07:51:09 +02:00
|
|
|
/**
|
|
|
|
* Translate a granule into a timestamp.
|
|
|
|
* Will set dts if non-null and known.
|
|
|
|
* @return pts
|
|
|
|
*/
|
|
|
|
uint64_t (*gptopts)(AVFormatContext *, int, uint64_t, int64_t *dts);
|
2009-12-12 22:18:43 +02:00
|
|
|
/**
|
|
|
|
* 1 if granule is the start time of the associated packet.
|
|
|
|
* 0 if granule is the end time of the associated packet.
|
|
|
|
*/
|
|
|
|
int granule_is_start;
|
2012-09-20 02:01:43 +03:00
|
|
|
/**
|
|
|
|
* Number of expected headers
|
|
|
|
*/
|
|
|
|
int nb_header;
|
2013-01-04 18:05:51 +03:00
|
|
|
void (*cleanup)(AVFormatContext *s, int idx);
|
2008-11-06 03:50:56 +02:00
|
|
|
};
|
2005-04-09 18:32:58 +03:00
|
|
|
|
2008-11-06 03:50:56 +02:00
|
|
|
struct ogg_stream {
|
2005-04-09 18:32:58 +03:00
|
|
|
uint8_t *buf;
|
|
|
|
unsigned int bufsize;
|
|
|
|
unsigned int bufpos;
|
|
|
|
unsigned int pstart;
|
|
|
|
unsigned int psize;
|
2007-11-11 23:56:18 +02:00
|
|
|
unsigned int pflags;
|
2009-10-13 00:30:03 +03:00
|
|
|
unsigned int pduration;
|
2005-04-09 18:32:58 +03:00
|
|
|
uint32_t serial;
|
2009-12-12 22:18:43 +02:00
|
|
|
uint64_t granule;
|
2012-09-20 02:07:09 +03:00
|
|
|
uint64_t start_granule;
|
2009-12-12 22:18:43 +02:00
|
|
|
int64_t lastpts;
|
2010-01-11 07:51:09 +02:00
|
|
|
int64_t lastdts;
|
2010-03-11 09:17:24 +02:00
|
|
|
int64_t sync_pos; ///< file offset of the first page needed to reconstruct the current packet
|
|
|
|
int64_t page_pos; ///< file offset of the current page
|
2005-04-09 18:32:58 +03:00
|
|
|
int flags;
|
2009-05-07 02:02:26 +03:00
|
|
|
const struct ogg_codec *codec;
|
2005-04-09 18:32:58 +03:00
|
|
|
int header;
|
|
|
|
int nsegs, segp;
|
|
|
|
uint8_t segments[255];
|
2010-02-08 12:13:03 +02:00
|
|
|
int incomplete; ///< whether we're expecting a continuation in the next page
|
2009-12-12 22:18:43 +02:00
|
|
|
int page_end; ///< current packet is the last one completed in the page
|
2010-03-11 09:18:00 +02:00
|
|
|
int keyframe_seek;
|
2011-08-25 00:13:57 +03:00
|
|
|
int got_start;
|
2012-09-16 23:24:11 +03:00
|
|
|
int got_data; ///< 1 if the stream got some data (non-initial packets), 0 otherwise
|
2012-09-20 02:01:43 +03:00
|
|
|
int nb_header; ///< set to the number of parsed headers
|
2020-04-28 13:25:46 +02:00
|
|
|
int start_trimming; ///< set the number of packets to drop from the start
|
2013-09-12 20:24:18 +03:00
|
|
|
int end_trimming; ///< set the number of packets to drop from the end
|
2014-02-05 20:10:54 +03:00
|
|
|
uint8_t *new_metadata;
|
|
|
|
unsigned int new_metadata_size;
|
2005-05-11 19:38:34 +03:00
|
|
|
void *private;
|
2008-11-06 03:50:56 +02:00
|
|
|
};
|
2005-04-09 18:32:58 +03:00
|
|
|
|
2008-11-06 03:50:56 +02:00
|
|
|
struct ogg_state {
|
2005-04-09 18:32:58 +03:00
|
|
|
uint64_t pos;
|
|
|
|
int curidx;
|
|
|
|
struct ogg_state *next;
|
2007-01-16 00:05:22 +02:00
|
|
|
int nstreams;
|
2008-11-06 03:50:56 +02:00
|
|
|
struct ogg_stream streams[1];
|
|
|
|
};
|
2005-04-09 18:32:58 +03:00
|
|
|
|
2008-11-06 03:50:56 +02:00
|
|
|
struct ogg {
|
|
|
|
struct ogg_stream *streams;
|
2005-04-09 18:32:58 +03:00
|
|
|
int nstreams;
|
|
|
|
int headers;
|
|
|
|
int curidx;
|
2013-01-13 23:23:11 +03:00
|
|
|
int64_t page_pos; ///< file offset of the current page
|
2008-11-06 03:50:56 +02:00
|
|
|
struct ogg_state *state;
|
|
|
|
};
|
2005-04-09 18:32:58 +03:00
|
|
|
|
|
|
|
#define OGG_FLAG_CONT 1
|
|
|
|
#define OGG_FLAG_BOS 2
|
|
|
|
#define OGG_FLAG_EOS 4
|
|
|
|
|
2012-09-25 17:03:55 +03:00
|
|
|
#define OGG_NOGRANULE_VALUE (-1ull)
|
2012-09-20 02:07:09 +03:00
|
|
|
|
2011-04-15 20:18:04 +03:00
|
|
|
extern const struct ogg_codec ff_celt_codec;
|
2010-01-11 02:31:52 +02:00
|
|
|
extern const struct ogg_codec ff_dirac_codec;
|
2008-11-06 03:50:56 +02:00
|
|
|
extern const struct ogg_codec ff_flac_codec;
|
|
|
|
extern const struct ogg_codec ff_ogm_audio_codec;
|
|
|
|
extern const struct ogg_codec ff_ogm_old_codec;
|
|
|
|
extern const struct ogg_codec ff_ogm_text_codec;
|
|
|
|
extern const struct ogg_codec ff_ogm_video_codec;
|
2010-01-11 02:31:52 +02:00
|
|
|
extern const struct ogg_codec ff_old_dirac_codec;
|
2008-11-06 03:50:56 +02:00
|
|
|
extern const struct ogg_codec ff_old_flac_codec;
|
2012-06-24 12:38:18 +03:00
|
|
|
extern const struct ogg_codec ff_opus_codec;
|
2010-03-11 09:17:40 +02:00
|
|
|
extern const struct ogg_codec ff_skeleton_codec;
|
2008-11-06 03:50:56 +02:00
|
|
|
extern const struct ogg_codec ff_speex_codec;
|
|
|
|
extern const struct ogg_codec ff_theora_codec;
|
|
|
|
extern const struct ogg_codec ff_vorbis_codec;
|
2013-12-25 08:48:34 +03:00
|
|
|
extern const struct ogg_codec ff_vp8_codec;
|
2005-04-09 18:32:58 +03:00
|
|
|
|
2014-05-26 13:48:56 +03:00
|
|
|
int ff_vorbis_comment(AVFormatContext *ms, AVDictionary **m,
|
|
|
|
const uint8_t *buf, int size, int parse_picture);
|
2005-04-09 18:32:58 +03:00
|
|
|
|
2014-08-13 00:03:55 +03:00
|
|
|
int ff_vorbis_stream_comment(AVFormatContext *as, AVStream *st,
|
|
|
|
const uint8_t *buf, int size);
|
|
|
|
|
2010-03-11 09:17:33 +02:00
|
|
|
static inline int
|
|
|
|
ogg_find_stream (struct ogg * ogg, int serial)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < ogg->nstreams; i++)
|
|
|
|
if (ogg->streams[i].serial == serial)
|
|
|
|
return i;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint64_t
|
|
|
|
ogg_gptopts (AVFormatContext * s, int i, uint64_t gp, int64_t *dts)
|
|
|
|
{
|
|
|
|
struct ogg *ogg = s->priv_data;
|
|
|
|
struct ogg_stream *os = ogg->streams + i;
|
|
|
|
uint64_t pts = AV_NOPTS_VALUE;
|
|
|
|
|
2010-03-11 09:17:36 +02:00
|
|
|
if(os->codec && os->codec->gptopts){
|
2010-03-11 09:17:33 +02:00
|
|
|
pts = os->codec->gptopts(s, i, gp, dts);
|
|
|
|
} else {
|
|
|
|
pts = gp;
|
|
|
|
if (dts)
|
|
|
|
*dts = pts;
|
|
|
|
}
|
2016-08-03 13:34:40 +02:00
|
|
|
if (pts > INT64_MAX && pts != AV_NOPTS_VALUE) {
|
|
|
|
// The return type is unsigned, we thus cannot return negative pts
|
|
|
|
av_log(s, AV_LOG_ERROR, "invalid pts %"PRId64"\n", pts);
|
|
|
|
pts = AV_NOPTS_VALUE;
|
|
|
|
}
|
2010-03-11 09:17:33 +02:00
|
|
|
|
|
|
|
return pts;
|
|
|
|
}
|
|
|
|
|
2008-08-31 10:39:47 +03:00
|
|
|
#endif /* AVFORMAT_OGGDEC_H */
|