From 0c9459454153821c2044742348422534cd459143 Mon Sep 17 00:00:00 2001 From: Austen Dicken Date: Mon, 12 Mar 2012 23:26:34 -0500 Subject: [PATCH] remove the need for libtheora since we have ffmpeg to handle theora videos --- Docs/Changelog_sm5.txt | 4 + autoconf/m4/video.m4 | 25 - extern/vorbis/theora/codec.h | 557 ------------ extern/vorbis/theora/theora.h | 534 ------------ extern/vorbis/theora/theoradec.h | 280 ------ extern/vorbis/win32/theora_static.lib | Bin 178192 -> 0 bytes src/Makefile.am | 4 - src/StepMania-net2003.vcproj | 6 - src/StepMania-net2005.vcproj | 8 - src/StepMania-net2008.vcproj | 8 - src/StepMania-net2010.vcxproj | 4 +- src/StepMania-net2010.vcxproj.filters | 6 - src/arch/MovieTexture/MovieTexture_Theora.cpp | 816 ------------------ src/arch/MovieTexture/MovieTexture_Theora.h | 39 - src/arch/arch.cpp | 3 - src/arch/arch_default.h | 6 +- src/archutils/Darwin/arch_setup.h | 1 - src/archutils/Win32/arch_setup.h | 1 - 18 files changed, 8 insertions(+), 2294 deletions(-) delete mode 100644 extern/vorbis/theora/codec.h delete mode 100644 extern/vorbis/theora/theora.h delete mode 100644 extern/vorbis/theora/theoradec.h delete mode 100644 extern/vorbis/win32/theora_static.lib delete mode 100644 src/arch/MovieTexture/MovieTexture_Theora.cpp delete mode 100644 src/arch/MovieTexture/MovieTexture_Theora.h diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index 592c34b1cf..114e04c609 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -9,6 +9,10 @@ ________________________________________________________________________________ StepMania 5.0 alpha 2 | 201203?? -------------------------------------------------------------------------------- +2012/03/12 +---------- +* Remove libtheora support since ffmpeg already supports theora videos. [cvpcs] + 2012/03/10 ---------- * Update ffmpeg support to v0.10. [cvpcs] diff --git a/autoconf/m4/video.m4 b/autoconf/m4/video.m4 index 6aceb10d20..2d77e7bb12 100644 --- a/autoconf/m4/video.m4 +++ b/autoconf/m4/video.m4 @@ -28,29 +28,4 @@ LIB_POST= AM_CONDITIONAL(HAVE_FFMPEG, test "$have_ffmpeg" = "yes") - - -AC_ARG_WITH(theora, AS_HELP_STRING([--without-theora],[Disable Theora support]), with_theora=$withval, with_theora=yes) - -have_vorbis=no -if test "$with_theora" = "yes"; then - AC_CHECK_LIB(ogg, ogg_stream_init, have_libogg=yes, have_libogg=no) - AC_CHECK_LIB(theora, theora_decode_init, have_libtheora=yes, have_libtheora=no, [-logg]) - if test "$have_libtheora" = "yes" -a "$have_libogg" = "yes" -a "$have_ffmpeg" = "yes"; then - have_theora=yes - LIBS="$LIBS -ltheora -logg" - AC_DEFINE(HAVE_THEORA, 1, [Theora support available]) - else - echo Not all theora libraries found. - - # Special note for unintuitive requirement (for color space conversion). - if test "$have_libtheora" = "yes" -a "$have_libogg" = "yes"; then - echo Ogg Theora support requires ffmpeg. - fi - fi - -fi - -AM_CONDITIONAL(HAVE_THEORA, test "$have_theora" = "yes" ) - ]) diff --git a/extern/vorbis/theora/codec.h b/extern/vorbis/theora/codec.h deleted file mode 100644 index 3ba7c5e901..0000000000 --- a/extern/vorbis/theora/codec.h +++ /dev/null @@ -1,557 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2003 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: codec.h 26239 2007-05-10 01:53:20Z gmaynard $ - - ********************************************************************/ - -/**\mainpage - * - * \section intro Introduction - * - * This is the documentation for the libtheora C API. - * libtheora is the reference implementation for - * Theora, a free video codec. - * Theora is derived from On2's VP3 codec with additional features and - * integration for Ogg multimedia formats by - * the Xiph.Org Foundation. - * Complete documentation of the format itself is available in - * the Theora - * specification. - * - * \subsection Organization - * - * libtheora is actually subdivided into three separate libraries: - * - libtheoraenc, containing routines exclusive to the encoder. - * You must link to this if you use any of the functions listed in - * \ref encfuncs. - * - libtheoradec, containing routines exclusive to the decoder. - * You must link to this if you use any of the functions listed in - * \ref decfuncs. - * - libtheorabase, containing routines shared by the encoder and the - * decoder. - * You must link to this if you use any of the functions in this API, not - * not just those listed in \ref basefuncs.*/ - -/**\file - * The shared libtheora C API.*/ - -#if !defined(_O_THEORA_CODEC_H_) -# define _O_THEORA_CODEC_H_ (1) -# include - -#if defined(__cplusplus) -extern "C" { -#endif - - - -/**\name Error codes*/ -/*@{*/ -/**An invalid pointer was provided.*/ -#define OC_FAULT (-1) -/**An invalid argument was provided.*/ -#define OC_EINVAL (-10) -/**The contents of the header were incomplete, invalid, or unexpected.*/ -#define OC_BADHEADER (-20) -/**The header does not belong to a Theora stream.*/ -#define OC_NOTFORMAT (-21) -/**The bitstream version is too high.*/ -#define OC_VERSION (-22) -/**The specified function is not implemented.*/ -#define OC_IMPL (-23) -/**There were errors in the video data packet.*/ -#define OC_BADPACKET (-24) -/*@}*/ - -/**The currently defined color space tags. - * See the Theora - * specification, Chapter 4, for exact details on the meaning of each of - * these color spaces.*/ -typedef enum{ - /**The color space was not specified at the encoder. - It may be conveyed by an external means.*/ - OC_CS_UNSPECIFIED, - /**A color space designed for NTSC content.*/ - OC_CS_ITU_REC_470M, - /**A color space designed for PAL/SECAM content.*/ - OC_CS_ITU_REC_470BG, - /**The total number of currently defined color spaces.*/ - OC_CS_NSPACES -}theora_colorspace; - -/**The currently defined pixel format tags. - * See the Theora - * specification, Section 4.4, for details on the precise sample - * locations.*/ -typedef enum{ - /**Chroma decimation by 2 in both the X and Y directions (4:2:0).*/ - OC_PF_420, - /**Currently reserved.*/ - OC_PF_RSVD, - /**Chroma decimation by 2 in the X direction (4:2:2).*/ - OC_PF_422, - /**No chroma decimation (4:4:4).*/ - OC_PF_444, - /**The total number of currently defined pixel formats.*/ - OC_PF_NFORMATS -}theora_pixel_fmt; - - - -/**A buffer for a single color plane in an uncompressed image. - * This contains the image data in a left-to-right, top-down format. - * Each row of pixels is stored contiguously in memory, but successive rows - * need not be. - * Use \a ystride to compute the offset of the next row. - * The encoder accepts both positive \a ystride values (top-down) and negative - * (bottom-up). - * The decoder currently always generates images with positive strides. - */ -typedef struct{ - /**The width of this plane.*/ - int width; - /**The height of this plane.*/ - int height; - /**The offset in bytes between successive rows.*/ - int ystride; - /**A pointer to the first row.*/ - unsigned char *data; -}theora_img_plane; - -/**A complete image buffer for an uncompressed frame. - * The chroma planes may be decimated by a factor of two in either direction, - * as indicated by theora_info#pixel_fmt. - * The width and height of the Y' plane must be multiples of 16. - * They may need to be cropped for display, using the rectangle specified by - * theora_info#pic_x, theora_info#pic_y, theora_info#pic_width, and - * theora_info#pic_height. - * All samples are 8 bits. - * \note The term YUV often used to describe a colorspace is ambiguous. - * The exact parameters of the RGB to YUV conversion process aside, in many - * contexts the U and V channels actually have opposite meanings. - * To avoid this confusion, we are explicit: the name of the color channels is - * Y'CbCr, and they appear in that order, always. - * The prime symbol denotes that the Y channel is non-linear. - * Cb and Cr stand for "Chroma blue" and "Chroma red" respectively.*/ -typedef theora_img_plane theora_ycbcr_buffer[3]; - -/**Theora bitstream information. - * This contains the basic playback parameters for a stream, and corresponds to - * the initial 'info' header packet. - * To initialize an encoder, the application fills in this structure and - * passes it to theora_encode_alloc(). - * A default encoding mode is chosen based on the values of the #quality and - * #target_bitrate fields. - * On decode, it is filled in by theora_decode_headerin(), and then passed to - * theora_decode_alloc(). - * - * Encoded Theora frames must be a multiple of 16 in size; - * this is what the #frame_width and #frame_height members represent. - * To handle arbitrary picture sizes, a crop rectangle is specified in the - * #pic_x, #pic_y, #pic_width and #pic_height members. - * - * All frame buffers contain pointers to the full, padded frame. - * However, the current encoder will not reference pixels outside of - * the cropped picture region, and the application does not need to fill them - * in. - * The decoder will allocate storage for a full frame, but the - * application should not rely on the padding containing sensible - * data. - * - * It is also generally recommended that the offsets and sizes should still be - * multiples of 2 to avoid chroma sampling shifts. - * See the Theora - * specification, Section 4.4, for more details. - * - * Frame rate, in frames per second, is stored as a rational fraction, as is - * the pixel aspect ratio. - * Note that this refers to the aspect ratio of the individual pixels, not of - * the overall frame itself. - * The frame aspect ratio can be computed from pixel aspect ratio using the - * image dimensions. - */ -typedef struct{ - /**\name Theora version - * Bitstream version information.*/ - /*@{*/ - unsigned char version_major; - unsigned char version_minor; - unsigned char version_subminor; - /*@}*/ - /**The encoded frame width. - * This must be a multiple of 16, and less than 1048576.*/ - ogg_uint32_t frame_width; - /**The encoded frame height. - * This must be a multiple of 16, and less than 1048576.*/ - ogg_uint32_t frame_height; - /**The displayed picture width. - * This must be no larger than width.*/ - ogg_uint32_t pic_width; - /**The displayed picture height. - * This must be no larger than height.*/ - ogg_uint32_t pic_height; - /**The X offset of the displayed picture. - * This must be no larger than #frame_width-#pic_width or 255, whichever is - * smaller.*/ - ogg_uint32_t pic_x; - /**The Y offset of the displayed picture. - * This must be no larger than #frame_height-#pic_height, and - * #frame_height-#pic_height-#pic_y must be no larger than 255. - * This offset is specified from the top of the image, as this API uses the - * standard graphics left-handed coordinate system.*/ - ogg_uint32_t pic_y; - /**\name Frame rate - * The frame rate, as a fraction. - * If either is 0, the frame rate is undefined.*/ - /*@{*/ - ogg_uint32_t fps_numerator; - ogg_uint32_t fps_denominator; - /*@}*/ - /**\name Aspect ratio - * The aspect ratio of the pixels. - * If either value is zero, the aspect ratio is undefined. - * If not specified by any external means, 1:1 should be assumed.*/ - /*@{*/ - ogg_uint32_t aspect_numerator; - ogg_uint32_t aspect_denominator; - /*@}*/ - /**The color space.*/ - theora_colorspace colorspace; - /**The pixel format.*/ - theora_pixel_fmt pixel_fmt; - /**The target bit-rate in bits per second. - If initializing an encoder with this struct, set this field to a non-zero - value to activate CBR encoding by default.*/ - /*TODO: Current encoder does not support CBR mode, or anything like it. - We also don't really know what nominal rate each quality level - corresponds to yet.*/ - int target_bitrate; - /**The target quality level. - Valid values range from 0 to 63, inclusive, with higher values giving - higher quality. - If initializing an encoder with this struct, and #target_bitrate is set - to zero, VBR encoding at this quality will be activated by default.*/ - /*Currently this is set so that a qi of 0 corresponds to distortions of 24 - times the JND, and each increase by 16 halves that value. - This gives us fine discrimination at low qualities, yet effective rate - control at high qualities. - The qi value 63 is special, however. - For this, the highest quality, we use one half of a JND for our threshold. - Due to the lower bounds placed on allowable quantizers in Theora, we will - not actually be able to achieve quality this good, but this should - provide as close to visually lossless quality as Theora is capable of. - We could lift the quantizer restrictions without breaking VP3.1 - compatibility, but this would result in quantized coefficients that are - too large for the current bitstream to be able to store. - We'd have to redesign the token syntax to store these large coefficients, - which would make transcoding complex.*/ - int quality; - /**The amount to shift to extract the last keyframe number from the granule - * position. - * This can be at most 31. - * theora_info_init() will set this to a default value (currently 6, - * which is good for streaming applications), but you can set it to 0 to - * make every frame a keyframe. - * The maximum distance between key frames is - * 1<<#keyframe_granule_shift. - * The keyframe frequency can be more finely controlled with - * #OC_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE, which can also be adjusted - * during encoding (for example, to force the next frame to be a keyframe), - * but it cannot be set larger than the amount permitted by this field after - * the headers have been output.*/ - int keyframe_granule_shift; -}theora_info; - -/**The comment information. - * - * This structure holds the in-stream metadata corresponding to - * the 'comment' header packet. - * The comment header is meant to be used much like someone jotting a quick - * note on the label of a video. - * It should be a short, to the point text note that can be more than a couple - * words, but not more than a short paragraph. - * - * The metadata is stored as a series of (tag, value) pairs, in - * length-encoded string vectors. - * The first occurrence of the '=' character delimits the tag and value. - * A particular tag may occur more than once, and order is significant. - * The character set encoding for the strings is always UTF-8, but the tag - * names are limited to ASCII, and treated as case-insensitive. - * See the Theora - * specification, Section 6.3.3 for details. - * - * In filling in this structure, theora_decode_header() will null-terminate - * the user_comment strings for safety. - * However, the bitstream format itself treats them as 8-bit clean vectors, - * possibly containing null characters, and so the length array should be - * treated as their authoritative length. - */ -typedef struct theora_comment{ - /**The array of comment string vectors.*/ - char **user_comments; - /**An array of the corresponding length of each vector, in bytes.*/ - int *comment_lengths; - /**The total number of comment strings.*/ - int comments; - /**The null-terminated vendor string. - This identifies the software used to encode the stream.*/ - char *vendor; -}theora_comment; - - - -/**A single base matrix.*/ -typedef unsigned char theora_quant_base[64]; - -/**A set of \a qi ranges.*/ -typedef struct{ - /**The number of ranges in the set.*/ - int nranges; - /**The size of each of the #nranges ranges. - These must sum to 63.*/ - const int *sizes; - /**#nranges +1 base matrices. - Matrices \a i and i+1 form the endpoints of range \a i.*/ - const theora_quant_base *base_matrices; -}theora_quant_ranges; - -/**A complete set of quantization parameters. - The quantizer for each coefficient is calculated as: - \code - Q=MAX(MIN(qmin[qti][ci!=0],scale[ci!=0][qi]*base[qti][pli][qi][ci]/100), - 1024). - \endcode - - \a qti is the quantization type index: 0 for intra, 1 for inter. - ci!=0 is 0 for the DC coefficient and 1 for the AC coefficient. - \a qi is the quality index, ranging between 0 (low quality) and 63 (high - quality). - \a pli is the color plane index: 0 for Y', 1 for Cb, 2 for Cr. - \a ci is the DCT coefficient index. - Coefficient indices correspond to the normal 2D DCT block - ordering--row-major with low frequencies first--\em not zig-zag order. - - Minimum quantizers are constant, and are given by: - \code - qmin[2][2]={{4,2},{8,4}}. - \endcode - - Parameters that can be stored in the bitstream are as follows: - - The two scale matrices ac_scale and dc_scale. - \code - scale[2][64]={dc_scale,ac_scale}. - \endcode - - The base matrices for each \a qi, \a qti and \a pli (up to 384 in all). - In order to avoid storing a full 384 base matrices, only a sparse set of - matrices is stored, and the rest are linearly interpolated. - This is done as follows. - For each \a qti and \a pli, a series of \a n \a qi ranges is defined. - The size of each \a qi range can vary arbitrarily, but they must sum to - 63. - Then, n+1 matrices are specified, one for each endpoint of the - ranges. - For interpolation purposes, each range's endpoints are the first \a qi - value it contains and one past the last \a qi value it contains. - Fractional values are rounded to the nearest integer, with ties rounded - away from zero. - - Base matrices are stored by reference, so if the same matrices are used - multiple times, they will only appear once in the bitstream. - The bitstream is also capable of omitting an entire set of ranges and - its associated matrices if they are the same as either the previous - set (indexed in row-major order) or if the inter set is the same as the - intra set. - - - Loop filter limit values. - The same limits are used for the loop filter in all color planes, despite - potentially differing levels of quantization in each. - - For the current encoder, scale[ci!=0][qi] must be no greater - than scale[ci!=0][qi-1] and base[qti][pli][qi][ci] must - be no greater than base[qti][pli][qi-1][ci]. - These two conditions ensure that the actual quantizer for a given \a qti, - \a pli, and \a ci does not increase as \a qi increases. - This is not required by the decoder.*/ -typedef struct{ - /**The DC scaling factors.*/ - ogg_uint16_t dc_scale[64]; - /**The AC scaling factors.*/ - ogg_uint16_t ac_scale[64]; - /**The loop filter limit values.*/ - unsigned char loop_filter_limits[64]; - /**The \a qi ranges for each \a ci and \a pli.*/ - theora_quant_ranges qi_ranges[2][3]; -}theora_quant_info; - - - -/**The number of Huffman tables used by Theora.*/ -#define OC_NHUFFMAN_TABLES (80) -/**The number of DCT token values in each table.*/ -#define OC_NDCT_TOKENS (32) - -/**A Huffman code for a Theora DCT token. - * Each set of Huffman codes in a given table must form a complete, prefix-free - * code. - * There is no requirement that all the tokens in a table have a valid code, - * but the current encoder is not optimized to take advantage of this. - * If there is not at least one table with a code for every token in each of - * the five groups of 16 tables, then the encoder may fail to encode certain - * frames. - * The complete table in the first group of 16 does not have to be in the same - * place as the complete table in the other groups, but the complete tables in - * the remaining four groups must all be in the same place.*/ -typedef struct{ - /**The bit pattern for the code, with the LSbit of the pattern aligned in - * the LSbit of the word.*/ - ogg_uint32_t pattern; - /**The number of bits in the code. - * This must be between 0 and 32, inclusive.*/ - int nbits; -}theora_huff_code; - - - -/**\defgroup basefuncs Functions Shared by Encode and Decode*/ -/*@{*/ -/**\name Basic shared functions*/ -/*@{*/ -/**Retrieves a human-readable string to identify the library vendor and - * version. - * \return the version string.*/ -extern const char *theora_version_string(void); -/**Retrieves the library version number. - * This is the highest bitstream version that the encoder library will produce, - * or that the decoder library can decode. - * This number is composed of a 16-bit major version, 8-bit minor version - * and 8 bit sub-version, composed as follows: - * \code - * (VERSION_MAJOR<<16)+(VERSION_MINOR<<8)+(VERSION_SUBMINOR) - * \endcode - * \return the version number.*/ -extern ogg_uint32_t theora_version_number(void); -/**Converts a granule position to an absolute frame number. - * The granule position is interpreted in the context of a given - * #theora_enc_ctx or #theora_dec_ctx handle (either will suffice). - * \param _encdec A previously allocated #theora_enc_ctx or #theora_dec_ctx - * handle. - * \param _granpos The granule position to convert. - * \returns The absolute frame number corresponding to \a _granpos. - * \retval -1 The given granule position was invalid (i.e. negative).*/ -extern ogg_int64_t theora_granule_frame(void *_encdec,ogg_int64_t _granpos); -/**Converts a granule position to an absolute time in seconds. - * The granule position is interpreted in the context of a given - * #theora_enc_ctx or #theora_dec_ctx handle (either will suffice). - * \param _encdec A previously allocated #theora_enc_ctx or #theora_dec_ctx - * handle. - * \param _granpos The granule position to convert. - * \return The absolute time in seconds corresponding to \a _granpos. - * \retval -1 The given granule position was invalid (i.e. negative).*/ -extern double theora_granule_time(void *_encdec,ogg_int64_t _granpos); -/**Determines whether a Theora packet is a header or not. - * This function does no verification beyond checking the packet type bit, so - * it should not be used for bitstream identification; use - * theora_decode_headerin() for that. - * \param _op An ogg_packet containing encoded Theora data. - * \retval 1 The packet is a header packet - * \retval 0 The packet is a video data packet.*/ -extern int theora_packet_isheader(ogg_packet *_op); -/**Determines whether a theora packet is a key frame or not. - * This function does no verification beyond checking the packet type and - * key frame bits, so it should not be used for bitstream identification; use - * theora_decode_headerin() for that. - * \param _op An ogg_packet containing encoded Theora data. - * \retval 1 The packet contains a key frame. - * \retval 0 The packet contains a delta frame. - * \retval -1 The packet is not a video data packet.*/ -extern int theora_packet_iskeyframe(ogg_packet *_op); -/*@}*/ - - -/**\name Functions for manipulating header data*/ -/*@{*/ -/**Initializes a theora_info structure. - * This should be called on a freshly allocated #theora_info structure before - * attempting to use it. - * \param _info The #theora_info struct to initialize.*/ -extern void theora_info_init(theora_info *_info); -/**Clears a #theora_info structure. - * This should be called on a #theora_info structure after it is no longer - * needed. - * \param _info The #theora_info struct to clear.*/ -extern void theora_info_clear(theora_info *_info); - -/**Initialize a #theora_comment structure. - * This should be called on a freshly allocated #theora_comment structure - * before attempting to use it. - * \param _tc The #theora_comment struct to initialize.*/ -extern void theora_comment_init(theora_comment *_tc); -/**Add a comment to an initialized #theora_comment structure. - * \note Neither theora_comment_add() nor theora_comment_add_tag() support - * comments containing null values, although the bitstream format does - * support them. - * To add such comments you will need to manipulate the #theora_comment - * structure directly. - * \param _tc The #theora_comment struct to add the comment to. - * \param _comment Must be a null-terminated UTF-8 string containing the - * comment in "TAG=the value" form.*/ -extern void theora_comment_add(theora_comment *_tc, char *_comment); -/**Add a comment to an initialized #theora_comment structure. - * \note Neither theora_comment_add() nor theora_comment_add_tag() support - * comments containing null values, although the bitstream format does - * support them. - * To add such comments you will need to manipulate the #theora_comment - * structure directly. - * \param _tc The #theora_comment struct to add the comment to. - * \param _tag A null-terminated string containing the tag associated with - * the comment. - * \param _val The corresponding value as a null-terminated string.*/ -extern void theora_comment_add_tag(theora_comment *_tc,char *_tag,char *_val); -/**Look up a comment value by its tag. - * \param _tc An initialized #theora_comment structure. - * \param _tag The tag to look up. - * \param _count The instance of the tag. - * The same tag can appear multiple times, each with a distinct - * value, so an index is required to retrieve them all. - * The order these values appear in is significant and should be - * preserved. - * Use theora_comment_query_count() to get the legal range for - * the \a _count parameter. - * \return A pointer to the queried tag's value. - * \retval NULL If no matching tag is found.*/ -extern char *theora_comment_query(theora_comment *_tc,char *_tag,int _count); -/**Look up the number of instances of a tag. - * Call this first when querying for a specific tag and then iterate over the - * number of instances with separate calls to theora_comment_query() to - * retrieve all instances in order. - * \param _tc An initialized #theora_comment structure. - * \param _tag The tag to look up. - * \return The number on instances of this particular tag.*/ -extern int theora_comment_query_count(theora_comment *_tc,char *_tag); -/**Clears a #theora_comment structure. - * This should be called on a #theora_comment structure after it is no longer - * needed. - * It will free all memory used by the structure members. - * \param _tc The #theora_comment struct to clear.*/ -extern void theora_comment_clear(theora_comment *_tc); -/*@}*/ -/*@}*/ - - - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/extern/vorbis/theora/theora.h b/extern/vorbis/theora/theora.h deleted file mode 100644 index 18208d1033..0000000000 --- a/extern/vorbis/theora/theora.h +++ /dev/null @@ -1,534 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2003 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: theora.h 18100 2005-10-20 10:59:59Z gmaynard $ - - ********************************************************************/ - -#ifndef _O_THEORA_H_ -#define _O_THEORA_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#ifndef LIBOGG2 -#include <../extern/vorbis/ogg/ogg.h> -#else -#include <../extern/vorbis/ogg2/ogg.h> -/* This is temporary until libogg2 is more complete */ -ogg_buffer_state *ogg_buffer_create(void); -#endif - -/** \mainpage - * - * \section intro Introduction - * - * This is the documentation for the libtheora C API. - * libtheora is the reference implementation for - * Theora, a free video codec. - * Theora is derived from On2's VP3 codec with improved integration for - * Ogg multimedia formats by Xiph.Org. - */ - -/** \file - * The libtheora C API. - */ - -/** - * A YUV buffer for passing uncompressed frames to and from the codec. - * This holds a Y'CbCr frame in planar format. The CbCr planes can be - * subsampled and have their own separate dimensions and row stride - * offsets. Note that the strides may be negative in some - * configurations. For theora the width and height of the largest plane - * must be a multiple of 16. The actual meaningful picture size and - * offset are stored in the theora_info structure; frames returned by - * the decoder may need to be cropped for display. - * All samples are 8 bits. - */ -typedef struct { - int y_width; /**< Width of the Y' luminance plane */ - int y_height; /**< Height of the luminance plane */ - int y_stride; /**< Offset in bytes between successive rows */ - - int uv_width; /**< Height of the Cb and Cr chroma planes */ - int uv_height; /**< Width of the chroma planes */ - int uv_stride; /**< Offset between successive chroma rows */ - unsigned char *y; /**< Pointer to start of luminance data */ - unsigned char *u; /**< Pointer to start of Cb data */ - unsigned char *v; /**< Pointer to start of Cr data */ - -} yuv_buffer; - -/** - * A Colorspace. - */ -typedef enum { - OC_CS_UNSPECIFIED, /**< The colorspace is unknown or unspecified */ - OC_CS_ITU_REC_470M, /**< This is the best option for 'NTSC' content */ - OC_CS_ITU_REC_470BG, /**< This is the best option for 'PAL' content */ - OC_CS_NSPACES /**< This marks the end of the defined colorspaces */ -} theora_colorspace; - -/** - * A Chroma subsampling - * - * These enumerate the available chroma subsampling options supported - * by the theora format. See Section 4.4 of the specification for - * exact definitions. - */ -typedef enum { - OC_PF_420, /**< Chroma subsampling by 2 in each direction (4:2:0) */ - OC_PF_RSVD, /**< Reserved value */ - OC_PF_422, /**< Horizonatal chroma subsampling by 2 (4:2:2) */ - OC_PF_444, /**< No chroma subsampling at all (4:4:4) */ -} theora_pixelformat; - -/** - * Theora bitstream info. - * Contains the basic playback parameters for a stream, - * corresponds to the initial 'info' header packet. - * - * Encoded theora frames must be a multiple of 16 is size; - * this is what the width and height members represent. To - * handle other sizes, a crop rectangle is specified in - * frame_height and frame_width, offset_x and offset_y. The - * offset and size should still be a power of 2 to avoid - * chroma sampling shifts. - * - * Frame rate, in frames per second is stored as a rational - * fraction. So is the aspect ratio. Note that this refers - * to the aspect ratio of the frame pixels, not of the - * overall frame itself. - * - * see the example code for use of the other parameters and - * good default settings for the encoder parameters. - */ -typedef struct { - ogg_uint32_t width; - ogg_uint32_t height; - ogg_uint32_t frame_width; - ogg_uint32_t frame_height; - ogg_uint32_t offset_x; - ogg_uint32_t offset_y; - ogg_uint32_t fps_numerator; - ogg_uint32_t fps_denominator; - ogg_uint32_t aspect_numerator; - ogg_uint32_t aspect_denominator; - theora_colorspace colorspace; - int target_bitrate; - int quality; /**< Nominal quality setting, 0-63 */ - int quick_p; /**< Quick encode/decode */ - - /* decode only */ - unsigned char version_major; - unsigned char version_minor; - unsigned char version_subminor; - - void *codec_setup; - - /* encode only */ - int dropframes_p; - int keyframe_auto_p; - ogg_uint32_t keyframe_frequency; - ogg_uint32_t keyframe_frequency_force; /* also used for decode init to - get granpos shift correct */ - ogg_uint32_t keyframe_data_target_bitrate; - ogg_int32_t keyframe_auto_threshold; - ogg_uint32_t keyframe_mindistance; - ogg_int32_t noise_sensitivity; - ogg_int32_t sharpness; - - theora_pixelformat pixelformat; - -} theora_info; - -/** Codec internal state and context. - */ -typedef struct{ - theora_info *i; - ogg_int64_t granulepos; - - void *internal_encode; - void *internal_decode; - -} theora_state; - -/** - * Comment header metadata. - * - * This structure holds the in-stream metadata corresponding to - * the 'comment' header packet. - * - * Meta data is stored as a series of (tag, value) pairs, in - * length-encoded string vectors. The first occurence of the - * '=' character delimits the tag and value. A particular tag - * may occur more than once. The character set encoding for - * the strings is always utf-8, but the tag names are limited - * to case-insensitive ascii. See the spec for details. - * - * In filling in this structure, theora_decode_header() will - * null-terminate the user_comment strings for safety. However, - * the bitstream format itself treats them as 8-bit clean, - * and so the length array should be treated as authoritative - * for their length. - */ -typedef struct theora_comment{ - char **user_comments; /**< An array of comment string vectors */ - int *comment_lengths; /**< An array of corresponding string vector lengths in bytes */ - int comments; /**< The total number of comment string vectors */ - char *vendor; /**< The vendor string identifying the encoder, null terminated */ - -} theora_comment; - -#define OC_FAULT -1 /**< General failure */ -#define OC_EINVAL -10 /**< Library encountered invalid internal data */ -#define OC_DISABLED -11 /**< Requested action is disabled */ -#define OC_BADHEADER -20 /**< Header packet was corrupt/invalid */ -#define OC_NOTFORMAT -21 /**< Packet is not a theora packet */ -#define OC_VERSION -22 /**< Bitstream version is not handled */ -#define OC_IMPL -23 /**< Feature or action not implemented */ -#define OC_BADPACKET -24 /**< Packet is corrupt */ -#define OC_NEWPACKET -25 /**< Packet is an (ignorable) unhandled extension */ - -/** - * Retrieve a human-readable string to identify the encoder vendor and version. - * \returns A version string. - */ -extern const char *theora_version_string(void); - -/** - * Retrieve a 32-bit version number. - * This number is composed of a 16-bit major version, 8-bit minor version - * and 8 bit sub-version, composed as follows: -
-   (VERSION_MAJOR<<16) + (VERSION_MINOR<<8) + (VERSION_SUB)
-
-* \returns The version number. -*/ -extern ogg_uint32_t theora_version_number(void); - -/** - * Initialize the theora encoder. - * \param th The theora_state handle to initialize for encoding. - * \param ti A theora_info struct filled with the desired encoding parameters. - * \retval 0 Success - */ -extern int theora_encode_init(theora_state *th, theora_info *ti); - -/** - * Submit a YUV buffer to the theora encoder. - * \param t A theora_state handle previously initialized for encoding. - * \param yuv A buffer of YUV data to encode. - * \retval OC_EINVAL Encoder is not ready, or is finished. - * \retval -1 The size of the given frame differs from those previously input - * \retval 0 Success - */ -extern int theora_encode_YUVin(theora_state *t, yuv_buffer *yuv); - -/** - * Request the next packet of encoded video. - * The encoded data is placed in a user-provided ogg_packet structure. - * \param t A theora_state handle previously initialized for encoding. - * \param last_p whether this is the last packet the encoder should produce. - * \param op An ogg_packet structure to fill. libtheora will set all - * elements of this structure, including a pointer to encoded - * data. The memory for the encoded data is owned by libtheora. - * \retval 0 No internal storage exists OR no packet is ready - * \retval -1 The encoding process has completed - * \retval 1 Success - */ -extern int theora_encode_packetout( theora_state *t, int last_p, - ogg_packet *op); - -/** - * Request a packet containing the initial header. - * A pointer to the header data is placed in a user-provided ogg_packet - * structure. - * \param t A theora_state handle previously initialized for encoding. - * \param op An ogg_packet structure to fill. libtheora will set all - * elements of this structure, including a pointer to the header - * data. The memory for the header data is owned by libtheora. - * \retval 0 Success - */ -extern int theora_encode_header(theora_state *t, ogg_packet *op); - -/** - * Request a comment header packet from provided metadata. - * A pointer to the comment data is placed in a user-provided ogg_packet - * structure. - * \param tc A theora_comment structure filled with the desired metadata - * \param op An ogg_packet structure to fill. libtheora will set all - * elements of this structure, including a pointer to the encoded - * comment data. The memory for the comment data is owned by - * libtheora. - * \retval 0 Success - */ -extern int theora_encode_comment(theora_comment *tc, ogg_packet *op); - -/** - * Request a packet containing the codebook tables for the stream. - * A pointer to the codebook data is placed in a user-provided ogg_packet - * structure. - * \param t A theora_state handle previously initialized for encoding. - * \param op An ogg_packet structure to fill. libtheora will set all - * elements of this structure, including a pointer to the codebook - * data. The memory for the header data is owned by libtheora. - * \retval 0 Success - */ -extern int theora_encode_tables(theora_state *t, ogg_packet *op); - -/** - * Decode an Ogg packet, with the expectation that the packet contains - * an initial header, comment data or codebook tables. - * - * \param ci A theora_info structure to fill. This must have been previously - * initialized with theora_info_init(). If \a op contains an initial - * header, theora_decode_header() will fill \a ci with the - * parsed header values. If \a op contains codebook tables, - * theora_decode_header() will parse these and attach an internal - * representation to \a ci->codec_setup. - * \param cc A theora_comment structure to fill. If \a op contains comment - * data, theora_decode_header() will fill \a cc with the parsed - * comments. - * \param op An ogg_packet structure which you expect contains an initial - * header, comment data or codebook tables. - * - * \retval OC_BADHEADER \a op is NULL; OR the first byte of \a op->packet - * has the signature of an initial packet, but op is - * not a b_o_s packet; OR this packet has the signature - * of an initial header packet, but an initial header - * packet has already been seen; OR this packet has the - * signature of a comment packet, but the initial header - * has not yet been seen; OR this packet has the signature - * of a comment packet, but contains invalid data; OR - * this packet has the signature of codebook tables, - * but the initial header or comments have not yet - * been seen; OR this packet has the signature of codebook - * tables, but contains invalid data; - * OR the stream being decoded has a compatible version - * but this packet does not have the signature of a - * theora initial header, comments, or codebook packet - * \retval OC_VERSION The packet data of \a op is an initial header with - * a version which is incompatible with this version of - * libtheora. - * \retval OC_NEWPACKET the stream being decoded has an incompatible (future) - * version and contains an unknown signature. - * \retval 0 Success - * - * \note The normal usage is that theora_decode_header() be called on the - * first three packets of a theora logical bitstream in succession. - */ -extern int theora_decode_header(theora_info *ci, theora_comment *cc, - ogg_packet *op); - -/** - * Initialize a theora_state handle for decoding. - * \param th The theora_state handle to initialize. - * \param c A theora_info struct filled with the desired decoding parameters. - * This is of course usually obtained from a previous call to - * theora_decode_header(). - * \retval 0 Success - */ -extern int theora_decode_init(theora_state *th, theora_info *c); - -/** - * Input a packet containing encoded data into the theora decoder. - * \param th A theora_state handle previously initialized for decoding. - * \param op An ogg_packet containing encoded theora data. - * \retval 0 Success - * \retval OC_BADPACKET \a op does not contain encoded video data - */ -extern int theora_decode_packetin(theora_state *th,ogg_packet *op); - -/** - * Output the next available frame of decoded YUV data. - * \param th A theora_state handle previously initialized for decoding. - * \param yuv A yuv_buffer in which libtheora should place the decoded data. - * \retval 0 Success - */ -extern int theora_decode_YUVout(theora_state *th,yuv_buffer *yuv); - -/** - * Report whether a theora packet is a header or not - * This function does no verification beyond checking the header - * flag bit so it should not be used for bitstream identification; - * use theora_decode_header() for that. - * - * \param op An ogg_packet containing encoded theora data. - * \retval 1 The packet is a header packet - * \retval 0 The packet is not a header packet (and so contains frame data) - * - * Thus function was added in the 1.0alpha4 release. - */ -extern int theora_packet_isheader(ogg_packet *op); - -/** - * Report whether a theora packet is a keyframe or not - * - * \param op An ogg_packet containing encoded theora data. - * \retval 1 The packet contains a keyframe image - * \retval 0 The packet is contains an interframe delta - * \retval -1 The packet is not an image data packet at all - * - * Thus function was added in the 1.0alpha4 release. - */ -extern int theora_packet_iskeyframe(ogg_packet *op); - -/** - * Report the granulepos shift radix - * - * When embedded in Ogg, Theora uses a two-part granulepos, - * splitting the 64-bit field into two pieces. The more-significant - * section represents the frame count at the last keyframe, - * and the less-significant section represents the count of - * frames since the last keyframe. In this way the overall - * field is still non-decreasing with time, but usefully encodes - * a pointer to the last keyframe, which is necessary for - * correctly restarting decode after a seek. - * - * This function reports the number of bits used to represent - * the distance to the last keyframe, and thus how the granulepos - * field must be shifted or masked to obtain the two parts. - * - * Since libtheora returns compressed data in an ogg_packet - * structure, this may be generally useful even if the Theora - * packets are not being used in an Ogg container. - * - * \param ti A previously initialized theora_info struct - * \returns The bit shift dividing the two granulepos fields - * - * This function was added in the 1.0alpha5 release. - */ -int theora_granule_shift(theora_info *ti); - -/** - * Convert a granulepos to an absolute frame number. The granulepos is - * interpreted in the context of a given theora_state handle. - * - * \param th A previously initialized theora_state handle (encode or decode) - * \param granulepos The granulepos to convert. - * \returns The frame number corresponding to \a granulepos. - * \retval -1 The given granulepos is undefined (i.e. negative) - * - * Thus function was added in the 1.0alpha4 release. - */ -extern ogg_int64_t theora_granule_frame(theora_state *th,ogg_int64_t granulepos); - -/** - * Convert a granulepos to absolute time in seconds. The granulepos is - * interpreted in the context of a given theora_state handle. - * \param th A previously initialized theora_state handle (encode or decode) - * \param granulepos The granulepos to convert. - * \returns The absolute time in seconds corresponding to \a granulepos. - * \retval -1. The given granulepos is undefined (i.e. negative), or - * \retval -1. The function has been disabled because floating - * point support is not available. - */ -extern double theora_granule_time(theora_state *th,ogg_int64_t granulepos); - -/** - * Initialize a theora_info structure. All values within the given theora_info - * structure are initialized, and space is allocated within libtheora for - * internal codec setup data. - * \param c A theora_info struct to initialize. - */ -extern void theora_info_init(theora_info *c); - -/** - * Clear a theora_info structure. All values within the given theora_info - * structure are cleared, and associated internal codec setup data is freed. - * \param c A theora_info struct to initialize. - */ -extern void theora_info_clear(theora_info *c); - -/** - * Free all internal data associated with a theora_state handle. - * \param t A theora_state handle. - */ -extern void theora_clear(theora_state *t); - -/** - * Initialize an allocated theora_comment structure - * \param tc An allocated theora_comment structure - **/ -extern void theora_comment_init(theora_comment *tc); - -/** - * Add a comment to an initialized theora_comment structure - * \param tc A previously initialized theora comment structure - * \param comment A null-terminated string encoding the comment in the form - * "TAG=the value" - * - * Neither theora_comment_add() nor theora_comment_add_tag() support - * comments containing null values, although the bitstream format - * supports this. To add such comments you will need to manipulate - * the theora_comment structure directly. - **/ - -extern void theora_comment_add(theora_comment *tc, char *comment); - -/** - * Add a comment to an initialized theora_comment structure. - * \param tc A previously initialized theora comment structure - * \param tag A null-terminated string containing the tag - * associated with the comment. - * \param value The corresponding value as a null-terminated string - * - * Neither theora_comment_add() nor theora_comment_add_tag() support - * comments containing null values, although the bitstream format - * supports this. To add such comments you will need to manipulate - * the theora_comment structure directly. - **/ -extern void theora_comment_add_tag(theora_comment *tc, - char *tag, char *value); - -/** - * Look up a comment value by tag. - * \param tc Tn initialized theora_comment structure - * \param tag The tag to look up - * \param count The instance of the tag. The same tag can appear multiple - * times, each with a distinct and ordered value, so an index - * is required to retrieve them all. - * \returns A pointer to the queried tag's value - * \retval NULL No matching tag is found - * - * \note Use theora_comment_query_count() to get the legal range for the - * count parameter. - **/ - -extern char *theora_comment_query(theora_comment *tc, char *tag, int count); - -/** Look up the number of instances of a tag. - * \param tc An initialized theora_comment structure - * \param tag The tag to look up - * \returns The number on instances of a particular tag. - * - * Call this first when querying for a specific tag and then interate - * over the number of instances with separate calls to - * theora_comment_query() to retrieve all instances in order. - **/ -extern int theora_comment_query_count(theora_comment *tc, char *tag); - -/** - * Clear an allocated theora_comment struct so that it can be freed. - * \param tc An allocated theora_comment structure. - **/ -extern void theora_comment_clear(theora_comment *tc); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _O_THEORA_H_ */ diff --git a/extern/vorbis/theora/theoradec.h b/extern/vorbis/theora/theoradec.h deleted file mode 100644 index c633ac4ea4..0000000000 --- a/extern/vorbis/theora/theoradec.h +++ /dev/null @@ -1,280 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2003 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: - last mod: $Id: theoradec.h 26239 2007-05-10 01:53:20Z gmaynard $ - - ********************************************************************/ - -/**\file - * The libtheora C decoding API.*/ - -#if !defined(_O_THEORA_THEORADEC_H_) -# define _O_THEORA_THEORADEC_H_ (1) -# include -# include "codec.h" - -#if defined(__cplusplus) -extern "C" { -#endif - - - -/**\name theora_decode_ctl() codes - * \anchor decctlcodes - * These are the available request codes for theora_decode_ctl(). - * By convention, these are odd, to distinguish them from the - * \ref encctlcodes "encoder control codes". - * Keep any experimental or vendor-specific values above \c 0x8000.*/ -/*@{*/ -/**Gets the maximum post-processing level. - * - * \param[out] _buf int: The maximum post-processing level. - * \retval OC_FAULT \a _dec_ctx or \a _buf is NULL. - * \retval OC_EINVAL \a _buf_sz is not sizeof(int). - * \retval OC_IMPL Not supported by this implementation.*/ -#define OC_DECCTL_GET_PPLEVEL_MAX (1) -/**Sets the post-processing level. - * By default, post-processing is disabled. - * - * \param[in] _buf int: The new post-processing level. - * 0 to disable; larger values use more CPU. - * \retval OC_FAULT \a _dec_ctx or \a _buf is NULL. - * \retval OC_EINVAL \a _buf_sz is not sizeof(int), or the - * post-processing level is out of bounds. - * The maximum post-processing level may be - * implementation-specific, and can be obtained via - * #OC_DECCTL_GET_PPLEVEL_MAX. - * \retval OC_IMPL Not supported by this implementation.*/ -#define OC_DECCTL_SET_PPLEVEL (3) -/**Sets the granule position. - * Call this after a seek, before decoding the first frame, to ensure that the - * proper granule position is returned for all subsequent frames. - * - * \param[in] _buf ogg_int64_t: The granule position of the next - * frame. - * \retval OC_FAULT \a _dec_ctx or \a _buf is NULL. - * \retval OC_EINVAL \a _buf_sz is not sizeof(ogg_int64_t), or the - * granule position is negative.*/ -#define OC_DECCTL_SET_GRANPOS (5) -/**Sets the striped decode callback function. - * If set, this function will be called as each piece of a frame is fully - * decoded in theora_decode_packetin(). - * You can pass in a #theora_stripe_callback with - * theora_stripe_callback#stripe_decoded set to NULL to disable the - * callbacks at any point. - * - * \param[in] _buf #theora_stripe_callback: The callback parameters. - * \retval OC_FAULT \a _dec_ctx or \a _buf is NULL. - * \retval OC_EINVAL \a _buf_sz is not - * sizeof(theora_stripe_callback).*/ -#define OC_DECCTL_SET_STRIPE_CB (7) -/*@}*/ - - - -/**A callback function for striped decode. - * This is a function pointer to an application-provided function that will be - * called each time a section of the image is fully decoded in - * theora_decode_packetin(). - * This allows the application to process the section immediately, while it is - * still in cache. - * Note that the frame is decoded bottom to top, so \a _yfrag0 will steadily - * decrease with each call until it reaches 0, at which point the full frame - * is decoded. - * The number of fragment rows made available in each call depends on the pixel - * format and the number of post-processing filters enabled, and may not even - * be constant for the entire frame. - * If a non-NULL \a _granpos pointer is passed to - * theora_decode_packetin(), the granule position for the frame will be stored - * in it before the first callback is made. - * If an entire frame is dropped (a 0-byte packet), then no callbacks will be - * made at all for that frame. - * \param _ctx An application-provided context pointer. - * \param _buf The image buffer for the decoded frame. - * \param _yfrag0 The Y coordinate of the first row of 8x8 fragments - * decoded. - * Multiply this by 8 to obtain the pixel row number in the - * luma plane. - * If the chroma planes are subsampled in the Y direction, - * this will always be divisible by two. - * \param _yfrag_end The Y coordinate of the first row of 8x8 fragments past - * the newly decoded section. - * If the chroma planes are subsampled in the Y direction, - * this will always be divisible by two. - * I.e., this section contains fragment rows - * \a _yfrag0 ...\a _yfrag_end -1.*/ -typedef void (*theora_stripe_decoded_func)(void *_ctx,theora_ycbcr_buffer _buf, - int _yfrag0,int _yfrag_end); - -/**The striped decode callback data to pass to #OC_DECCTL_SET_STRIPE_CB.*/ -typedef struct{ - /**An application-provided context pointer. - * This will be passed back verbatim to the application.*/ - void *ctx; - /**The callback function pointer.*/ - theora_stripe_decoded_func stripe_decoded; -}theora_stripe_callback; - - - -/**\name Decoder state - The following data structures are opaque, and their contents are not - publicly defined by this API. - Referring to their internals directly is unsupported, and may break without - warning.*/ -/*@{*/ -/**The decoder context.*/ -typedef struct theora_dec_ctx theora_dec_ctx; -/**Setup information. - This contains auxiliary information (Huffman tables and quantization - parameters) decoded from the setup header by theora_decode_headerin() to be - passed to theora_decode_alloc(). - It can be re-used to initialize any number of decoders, and can be freed - via theora_setup_free() at any time.*/ -typedef struct theora_setup_info theora_setup_info; -/*@}*/ - - - -/**\defgroup decfuncs Functions for Decoding*/ -/*@{*/ -/**\name Functions for decoding - * You must link to libtheorabase and libtheoradec if you use - * any of the functions in this section. - * - * The functions are listed in the order they are used in a typical decode. - * The basic steps are: - * - Parse the header packets by repeatedly calling theora_decode_headerin(). - * - Allocate a #theora_dec_ctx handle with theora_decode_alloc(). - * - Call theora_setup_free() to free any memory used for codec setup - * information. - * - Perform any additional decoder configuration with theora_decode_ctl(). - * - For each video data packet: - * - Submit the packet to the decoder via theora_decode_packetin(). - * - Retrieve the uncompressed video data via theora_decode_ycbcr_out(). - * - Call theora_decode_free() to release all decoder memory.*/ -/*@{*/ -/**Decodes the header packets of a Theora stream. - * This should be called on the initial packets of the stream, in succession, - * until it returns 0, indicating that all headers have been - * processed, or an error is encountered. - * At least three header packets are required, and additional optional header - * packets may follow. - * This can be used on the first packet of any logical stream to determine if - * that stream is a Theora stream. - * \param _info A #theora_info structure to fill in. - * This must have been previously initialized with - * theora_info_init(). - * The application may immediately begin using the contents of - * this structure after the first header is decoded, though it - * must continue to be passed in on all subsequent calls. - * \param _tc A #theora_comment structure to fill in. - * The application may immediately begin using the contents of - * this structure after the second header is decoded, though it - * must continue to be passed in on all subsequent calls. - * \param _setup Returns a pointer to additional, private setup information - * needed by the decoder. - * The contents of this pointer must be initialized to - * NULL on the first call, and the returned value must - * continue to be passed in on all subsequent calls. - * \param _op An ogg_packet structure which contains one of the - * initial packets of an Ogg logical stream. - * \return A positive value indicates that a Theora header was successfully - * processed. - * \retval 0 The first video data packet was encountered after all - * required header packets were parsed. - * The packet just passed in on this call should be saved - * and fed to theora_decode_packetin() to begin decoding - * video data. - * \retval OC_FAULT One of \a _info, \a _tc, or \a _setup was - * NULL. - * \retval OC_BADHEADER \a _op was NULL, the packet was not the next - * header packet in the expected sequence, or the format - * of the header data was invalid. - * \retval OC_VERSION The packet data was a Theora info header, but for a - * bitstream version not decodable with this version of - * libtheora. - * \retval OC_NOTFORMAT The packet was not a Theora header. - */ -extern int theora_decode_headerin(theora_info *_info,theora_comment *_tc, - theora_setup_info **_setup,ogg_packet *_op); -/**Allocates a decoder instance. - * \param _info A #theora_info struct filled via theora_decode_headerin(). - * \param _setup A #theora_setup_info handle returned via - * theora_decode_headerin(). - * \return The initialized #theora_dec_ctx handle. - * \retval NULL If the decoding parameters were invalid.*/ -extern theora_dec_ctx *theora_decode_alloc(const theora_info *_info, - const theora_setup_info *_setup); -/**Releases all storage used for the decoder setup information. - * This should be called after you no longer want to create any decoders for - * a stream whose headers you have parsed with theora_decode_headerin(). - * \param _setup The setup information to free. - * This can safely be NULL.*/ -extern void theora_setup_free(theora_setup_info *_setup); -/**Encoder control function. - * This is used to provide advanced control the decoding process. - * \param _dec A #theora_dec_ctx handle. - * \param _req The control code to process. - * See \ref decctlcodes "the list of available control codes" - * for details. - * \param _buf The parameters for this control code. - * \param _buf_sz The size of the parameter buffer.*/ -extern int theora_decode_ctl(theora_dec_ctx *_dec,int _req,void *_buf, - size_t _buf_sz); -/**Submits a packet containing encoded video data to the decoder. - * \param _dec A #theora_dec_ctx handle. - * \param _op An ogg_packet containing encoded video data. - * \param _granpos Returns the granule position of the decoded packet. - * If non-NULL, the granule position for this specific - * packet is stored in this location. - * This is computed incrementally from previously decoded - * packets. - * After a seek, the correct granule position must be set via - * #OC_DECCTL_SET_GRANPOS for this to work properly. - * \retval 0 Success. - * \retval OC_FAULT \a _dec or _op was NULL. - * \retval OC_BADPACKET \a _op does not contain encoded video data. - * \retval OC_IMPL The video data uses bitstream features which this - * library does not support.*/ -extern int theora_decode_packetin(theora_dec_ctx *_dec,const ogg_packet *_op, - ogg_int64_t *_granpos); -/**Outputs the next available frame of decoded Y'CbCr data. - * If a striped decode callback has been set with #OC_DECCTL_SET_STRIPE_CB, - * then the application does not need to call this function. - * \param _dec A #theora_dec_ctx handle. - * \param _ycbcr A video buffer structure to fill in. - * libtheora will fill in all the members of this - * structure, including the pointers to the uncompressed video - * data. - * The memory for this video data is owned by - * libtheora. - * It may be freed or overwritten without notification when - * subsequent frames are decoded. - * \retval 0 Success - */ -extern int theora_decode_ycbcr_out(theora_dec_ctx *_dec, - theora_ycbcr_buffer _ycbcr); -/**Frees an allocated decoder instance. - * \param _dec A #theora_dec_ctx handle.*/ -extern void theora_decode_free(theora_dec_ctx *_dec); -/*@}*/ -/*@}*/ - - - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/extern/vorbis/win32/theora_static.lib b/extern/vorbis/win32/theora_static.lib deleted file mode 100644 index beb4a51d53de4b80c1e87b7339d541c5b5c3a333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178192 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%0A0OOZ#mjU*aeBB1V<=U zEl-6}YHm60r^B#^r^2d?UJ(tlxL*fh(!q=dGuQNwQYPwVt4XmL#yS`Kobs=jlUNt< zy2WaQ?BWbqR6FHCZ$g3I*~ng&5+e>-HEVfCskW!o-`f6PYJH|i=9{S&+F44$QYdCc z0!tH#GzzH|QDorKfD`m@3kNB$JX%$CW~2Z-wpr0ORN%F*u4+?m`%0A^(Sv_!w2gTp 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 A>;M1& diff --git a/src/Makefile.am b/src/Makefile.am index f5a8145dac..4672074eec 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -246,10 +246,6 @@ MovieTexture = arch/MovieTexture/MovieTexture.cpp arch/MovieTexture/MovieTexture arch/MovieTexture/MovieTexture_Generic.cpp arch/MovieTexture/MovieTexture_Generic.h \ arch/MovieTexture/MovieTexture_Null.cpp arch/MovieTexture/MovieTexture_Null.h -if HAVE_THEORA -MovieTexture += arch/MovieTexture/MovieTexture_Theora.cpp arch/MovieTexture/MovieTexture_Theora.h -endif - if HAVE_FFMPEG MovieTexture += arch/MovieTexture/MovieTexture_FFMpeg.cpp arch/MovieTexture/MovieTexture_FFMpeg.h endif diff --git a/src/StepMania-net2003.vcproj b/src/StepMania-net2003.vcproj index 65b6d9cbf9..769eb14558 100644 --- a/src/StepMania-net2003.vcproj +++ b/src/StepMania-net2003.vcproj @@ -3456,12 +3456,6 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ - - - - - - - - - - - - - @@ -1899,7 +1898,6 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir) - @@ -2387,4 +2385,4 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir) - \ No newline at end of file + diff --git a/src/StepMania-net2010.vcxproj.filters b/src/StepMania-net2010.vcxproj.filters index 6864a154a9..237aef0c0c 100644 --- a/src/StepMania-net2010.vcxproj.filters +++ b/src/StepMania-net2010.vcxproj.filters @@ -711,9 +711,6 @@ StepMania\arch\MovieTexture - - StepMania\arch\MovieTexture - StepMania\arch\LowLevelWindow @@ -2222,9 +2219,6 @@ StepMania\arch\MovieTexture - - StepMania\arch\MovieTexture - StepMania\arch\LowLevelWindow diff --git a/src/arch/MovieTexture/MovieTexture_Theora.cpp b/src/arch/MovieTexture/MovieTexture_Theora.cpp deleted file mode 100644 index 85e361fa36..0000000000 --- a/src/arch/MovieTexture/MovieTexture_Theora.cpp +++ /dev/null @@ -1,816 +0,0 @@ -#include "global.h" -#include "MovieTexture_Theora.h" -#include "RageDisplay.h" -#include "RageFile.h" -#include "RageLog.h" -#include "RageSurface.h" -#include "RageUtil.h" -#include "MovieTexture_FFMpeg.h" /* for AVCodecCreateCompatibleSurface */ - -namespace avcodec -{ - extern "C" - { - #include // for avcodec::img_convert - #include - } -}; - -// #define HAVE_THEORAEXP - -#if !defined(HAVE_THEORAEXP) -#include <../extern/vorbis/theora/theora.h> - -#if defined(_MSC_VER) -#pragma comment(lib, OGG_LIB_DIR "ogg_static.lib") -#pragma comment(lib, OGG_LIB_DIR "theora_static.lib") -#endif - -#if !defined(MACOSX) - static const int sws_flags = SWS_BICUBIC; // XXX: Reasonable default? -#endif - -class MovieDecoder_Theora: public MovieDecoder -{ -public: - MovieDecoder_Theora(); - ~MovieDecoder_Theora(); - - RString Open( RString sFile ); - void Close(); - void Rewind() { } // XXX - - int DecodeFrame( float fTargetTime ); - void GetFrame( RageSurface *pOut ); - RageSurface *CreateCompatibleSurface( int iTextureWidth, int iTextureHeight, bool bPreferHighColor, MovieDecoderPixelFormatYCbCr &fmtout ); - - int GetWidth() const { return m_TheoraInfo.frame_width; } - int GetHeight() const { return m_TheoraInfo.frame_height; } - float GetSourceAspectRatio() const; - - float GetTimestamp() const; - float GetFrameDuration() const; - -private: - void Init(); - RString ProcessHeaders(); - int ReadPage( ogg_page *pOggPage, RString &sError, bool bInitializing ); - void ConvertToSurface( RageSurface *pSurface ) const; // sm4svn - - // sm-ssc with modern ffmpeg: -#if !defined(MACOSX) - void ConvertToSurface( RageSurface *pSurface ); - void ConvertImage( avcodec::AVPicture &in, avcodec::AVPicture &out, int height ); -#endif - - RageFile m_File; - - ogg_sync_state m_OggSync; - ogg_stream_state m_OggStream; - theora_info m_TheoraInfo; - theora_comment m_TheoraComment; - theora_state m_TheoraState; - - ogg_int64_t m_iGranulepos; - - avcodec::PixelFormat m_InputPixFmt; /* PixelFormat of YUV input surface */ - avcodec::PixelFormat m_OutputPixFmt; /* PixelFormat of RGB output surface */ -#if !defined(MACOSX) - avcodec::SwsContext *m_swsctx; -#endif -}; - -MovieDecoder_Theora::MovieDecoder_Theora() -{ - avcodec::avcodec_init(); - - memset( &m_TheoraInfo, 0, sizeof(m_TheoraInfo) ); - memset( &m_TheoraComment, 0, sizeof(m_TheoraComment) ); - memset( &m_OggStream, 0, sizeof(m_OggStream) ); - memset( &m_TheoraState, 0, sizeof(m_TheoraState) ); -#if !defined(MACOSX) - m_swsctx = NULL; -#endif -} - -MovieDecoder_Theora::~MovieDecoder_Theora() -{ - Close(); -#if !defined(MACOSX) - if (m_swsctx) - { - avcodec::sws_freeContext(m_swsctx); - m_swsctx = NULL; - } -#endif -} - -void MovieDecoder_Theora::Init() -{ - theora_info_init( &m_TheoraInfo ); - theora_comment_init( &m_TheoraComment ); - ogg_sync_init( &m_OggSync ); -} - -int MovieDecoder_Theora::ReadPage( ogg_page *pOggPage, RString &sError, bool bInitializing ) -{ - while(1) - { - int iRet = ogg_sync_pageout( &m_OggSync, pOggPage ); - if( iRet > 0 ) - return iRet; - if( iRet < 0 ) - { - if( bInitializing ) - { - sError = "not an Ogg file"; - return -1; - } - - LOG->Trace( "%s: hole in stream", m_File.GetPath().c_str() ); - continue; - } - - if( iRet == 0 ) - { - char *pBuffer = ogg_sync_buffer( &m_OggSync, 4096 ); - int iBytes = m_File.Read( pBuffer, 4096 ); - if( iBytes == 0 ) - return 0; - if( iBytes == -1 ) - { - sError = ssprintf( "error reading: %s", m_File.GetError().c_str() ); - return -1; - } - - ogg_sync_wrote( &m_OggSync, iBytes ); - } - } -} - -RString MovieDecoder_Theora::ProcessHeaders() -{ - int iTheoraPacketsProcessed = 0; - while(1) - { - ogg_page OggPage; - RString sError; - int ret = ReadPage( &OggPage, sError, true ); - if( ret == 0 ) - return ssprintf( "error opening %s: EOF while searching for codec headers", m_File.GetPath().c_str() ); - if( ret<0 ) - return ssprintf( "error reading %s: %s", m_File.GetPath().c_str(), sError.c_str() ); - - if( m_OggStream.body_data == NULL ) - { - /* We don't have a stream yet. If this packet doesn't start a stream, - * then there aren't any Theora streams. */ - if( !ogg_page_bos(&OggPage) ) - return ssprintf( "error opening %s: no Theora streams found", m_File.GetPath().c_str() ); - - ogg_stream_init( &m_OggStream, ogg_page_serialno(&OggPage) ); - ogg_stream_pagein( &m_OggStream, &OggPage ); - ogg_packet op; - ogg_stream_packetout( &m_OggStream, &op ); - - if( theora_decode_header(&m_TheoraInfo, &m_TheoraComment, &op) < 0 ) - { - ogg_stream_clear( &m_OggStream ); - continue; - } - - /* We've found the Theora stream. */ - iTheoraPacketsProcessed++; - } - else - ogg_stream_pagein( &m_OggStream, &OggPage ); - - /* Look for more headers in this page. */ - while(1) - { - ogg_packet op; - int ret2 = ogg_stream_packetpeek( &m_OggStream, &op ); - if( ret2 == 0 ) - break; - if( ret2 < 0 ) - return ssprintf( "error opening %s: error parsing Theora stream headers", m_File.GetPath().c_str() ); - - if( !theora_packet_isheader(&op) ) - { - /* This is a body packet, not a header packet, so we're done processing - * headers. We must have at least three header packets. */ - if( iTheoraPacketsProcessed < 3 ) - return ssprintf( "error opening %s: error parsing Theora stream headers", m_File.GetPath().c_str() ); - return RString(); - } - - ret2 = theora_decode_header( &m_TheoraInfo, &m_TheoraComment, &op); - if( ret2 < 0 && ret2 != OC_NEWPACKET ) - return ssprintf( "error opening %s: error parsing Theora stream headers", m_File.GetPath().c_str() ); - - ogg_stream_packetout( &m_OggStream, NULL ); - iTheoraPacketsProcessed++; - } - } -} - -RString MovieDecoder_Theora::Open( RString sFile ) -{ - if( !m_File.Open(sFile) ) - return ssprintf( "error opening %s: %s", sFile.c_str(), m_File.GetError().c_str() ); - - Init(); - - RString sError = ProcessHeaders(); - if( !sError.empty() ) - return sError; - - theora_decode_init( &m_TheoraState, &m_TheoraInfo ); - - RString sOutput = ssprintf( "MovieDecoder_Theora: Opened \"%s\". Serial: 0x%08lx, FPS: %.02f", - m_File.GetPath().c_str(), m_OggStream.serialno, 1/GetFrameDuration() ); - -#if 1 - m_InputPixFmt = avcodec::PIX_FMT_YUV420P; -#else - switch( m_TheoraInfo.pixelformat ) - { - case OC_PF_420: - m_InputPixFmt = avcodec::PIX_FMT_YUV420P; - sOutput += ", Format: YUV420"; - break; - case OC_PF_422: - m_InputPixFmt = avcodec::PIX_FMT_YUV422P; - sOutput += ", Format: YUV422"; - break; - case OC_PF_444: - m_InputPixFmt = avcodec::PIX_FMT_YUV444P; - sOutput += ", Format: YUV444"; - break; - default: - return ssprintf( "error opening %s: unsupported pixel format %i", m_File.GetPath().c_str(), m_TheoraInfo.pixelformat ); - } -#endif - LOG->Trace( "%s", sOutput.c_str() ); - - return RString(); -} - -int MovieDecoder_Theora::DecodeFrame( float fTargetTime ) -{ - while(1) - { - ogg_packet op; - if( ogg_stream_packetout(&m_OggStream, &op) != 0 ) - { - theora_decode_packetin( &m_TheoraState, &op ); - - if( fTargetTime != -1 && - GetTimestamp() + GetFrameDuration() <= fTargetTime ) - { - ogg_int64_t iFrame = theora_granule_frame( (theora_state *) &m_TheoraState, m_iGranulepos ); - if( (iFrame % 2) == 0 ) - continue; - } - - m_iGranulepos = m_TheoraState.granulepos; - return 1; - } - - /* Read more data. */ - ogg_page OggPage; - RString sError; - int ret = ReadPage( &OggPage, sError, false ); - if( ret == 0 ) - return 0; - if( ret == -1 ) - { - LOG->Warn( "error reading %s: %s", m_File.GetPath().c_str(), sError.c_str() ); - return -1; - } - if( ret > 0 ) - ogg_stream_pagein( &m_OggStream, &OggPage ); - } -} - -void MovieDecoder_Theora::GetFrame( RageSurface *pOut ) -{ - ConvertToSurface( pOut ); -} - -RageSurface *MovieDecoder_Theora::CreateCompatibleSurface( int iTextureWidth, int iTextureHeight, bool bPreferHighColor, MovieDecoderPixelFormatYCbCr &fmtout ) -{ - return RageMovieTextureDriver_FFMpeg::AVCodecCreateCompatibleSurface( iTextureWidth, iTextureHeight, bPreferHighColor, *ConvertValue(&m_OutputPixFmt), fmtout ); -} - -#if !defined(MACOSX) -void MovieDecoder_Theora::ConvertImage( avcodec::AVPicture &in, avcodec::AVPicture &out, int height ) -{ - // XXX: Do we need separate contexts for different heights? - // XXX: Do this in one of the Open() methods instead? - // XXX: The problem of doing this in Open() is that m_OutputPixFmt is not already initialized with its correct value. - if( m_swsctx == NULL ) - { - m_swsctx = avcodec::sws_getCachedContext( m_swsctx, - GetWidth(), GetHeight(), m_InputPixFmt, - GetWidth(), GetHeight(), m_OutputPixFmt, - sws_flags, NULL, NULL, NULL ); - if( m_swsctx == NULL ) - { - LOG->Warn("Cannot initialize sws conversion context for (%d,%d) %d->%d", GetWidth(), GetHeight(), m_InputPixFmt, m_OutputPixFmt); - return; - } - } - - avcodec::sws_scale( m_swsctx, - in.data, in.linesize, 0, height, - out.data, out.linesize ); -} -#endif -// const in sm4svn: -void MovieDecoder_Theora::ConvertToSurface( RageSurface *pSurface ) -#if defined(MACOSX) -const -#endif -{ - yuv_buffer yuv; - theora_decode_YUVout( (theora_state *) &m_TheoraState, &yuv ); - - /* XXX: non-zero offset untested */ - int iUVOffsetX = m_TheoraInfo.offset_x; - int iUVOffsetY = m_TheoraInfo.offset_y; - if( m_InputPixFmt == avcodec::PIX_FMT_YUV420P || avcodec::PIX_FMT_YUV422P ) - iUVOffsetX /= 2; - if( m_InputPixFmt == avcodec::PIX_FMT_YUV420P ) - iUVOffsetY /= 2; - - avcodec::AVPicture YUVIn; - YUVIn.data[0] = yuv.y + m_TheoraInfo.offset_x + yuv.y_stride*m_TheoraInfo.offset_y; - YUVIn.data[1] = yuv.u + iUVOffsetX + yuv.uv_stride*iUVOffsetY; - YUVIn.data[2] = yuv.v + iUVOffsetX + yuv.uv_stride*iUVOffsetY; - YUVIn.data[3] = NULL; - YUVIn.linesize[0] = yuv.y_stride; - YUVIn.linesize[1] = yuv.uv_stride; - YUVIn.linesize[2] = yuv.uv_stride; - YUVIn.linesize[3] = 0; - - avcodec::AVPicture RGBOut; - RGBOut.data[0] = (unsigned char *) pSurface->pixels; - RGBOut.linesize[0] = pSurface->pitch; - - // sm4svn code: -#if defined(MACOSX) - avcodec::img_convert( &RGBOut, m_OutputPixFmt, - &YUVIn, m_InputPixFmt, - m_TheoraInfo.frame_width, m_TheoraInfo.frame_height ); -#else - ConvertImage( YUVIn, RGBOut, m_TheoraInfo.frame_height ); -#endif -} - -float MovieDecoder_Theora::GetSourceAspectRatio() const -{ - return (float) m_TheoraInfo.aspect_numerator / m_TheoraInfo.aspect_denominator; -} - -float MovieDecoder_Theora::GetTimestamp() const -{ - return (float) theora_granule_time( (theora_state *) &m_TheoraState, m_iGranulepos ); -} - -float MovieDecoder_Theora::GetFrameDuration() const -{ - return (float) m_TheoraInfo.fps_denominator / m_TheoraInfo.fps_numerator; -} - -void MovieDecoder_Theora::Close() -{ - ogg_stream_clear( &m_OggStream ); - theora_clear( &m_TheoraState ); - theora_comment_clear( &m_TheoraComment ); - theora_info_clear( &m_TheoraInfo ); - ogg_sync_clear( &m_OggSync ); -} - -#else - -#include -#include - -#if defined(_MSC_VER) -#pragma comment(lib, OGG_LIB_DIR "ogg_static.lib") -#pragma comment(lib, OGG_LIB_DIR "theorabase_static.lib") -#pragma comment(lib, OGG_LIB_DIR "theoradec_static.lib") -#endif - -class MovieDecoder_Theora: public MovieDecoder -{ -public: - MovieDecoder_Theora(); - ~MovieDecoder_Theora(); - - RString Open( RString sFile ); - void Close(); - - int GetFrame( RageSurface *pOut, float fTargetTime ); - RageSurface *CreateCompatibleSurface( int iTextureWidth, int iTextureHeight, bool bPreferHighColor, MovieDecoderPixelFormatYCbCr &fmtout ); - - int GetWidth() const { return m_TheoraInfo.frame_width; } - int GetHeight() const { return m_TheoraInfo.frame_height; } - float GetSourceAspectRatio() const; - - float GetTimestamp() const; - float GetFrameDuration() const; - -private: - void Init(); - RString ProcessHeaders( theora_setup_info **pTheoraSetupInfo ); - int ReadPage( ogg_page *pOggPage, RString &sError, bool bInitializing ); - static void DecodeStripeStub( void *pCtx, theora_ycbcr_buffer yuv, int yfrag0, int yfrag_end ); - void DecodeStripe( theora_ycbcr_buffer yuv, int yfrag0, int yfrag_end ); - - RageFile m_File; - - ogg_sync_state m_OggSync; - ogg_stream_state m_OggStream; - theora_info m_TheoraInfo; - theora_comment m_TheoraComment; - theora_dec_ctx *m_TheoraState; - - ogg_int64_t m_iGranulepos; - - avcodec::PixelFormat m_InputPixFmt; /* PixelFormat of YUV input surface */ - avcodec::PixelFormat m_OutputPixFmt; /* PixelFormat of RGB output surface */ - - /* This is only set during GetFrame, for DecodeStripe. */ - RageSurface *m_pSurface; -}; - -MovieDecoder_Theora::MovieDecoder_Theora() -{ - avcodec::avcodec_init(); - - memset( &m_TheoraInfo, 0, sizeof(m_TheoraInfo) ); - memset( &m_TheoraComment, 0, sizeof(m_TheoraComment) ); - memset( &m_OggStream, 0, sizeof(m_OggStream) ); - m_TheoraState = NULL; -} - -MovieDecoder_Theora::~MovieDecoder_Theora() -{ - Close(); -} - -void MovieDecoder_Theora::Init() -{ - theora_info_init( &m_TheoraInfo ); - theora_comment_init( &m_TheoraComment ); - ogg_sync_init( &m_OggSync ); -} - -int MovieDecoder_Theora::ReadPage( ogg_page *pOggPage, RString &sError, bool bInitializing ) -{ - while(1) - { - int iRet = ogg_sync_pageout( &m_OggSync, pOggPage ); - if( iRet > 0 ) - return iRet; - if( iRet < 0 ) - { - if( bInitializing ) - { - sError = "not an Ogg file"; - return -1; - } - - LOG->Trace( "%s: hole in stream", m_File.GetPath().c_str() ); - continue; - } - - if( iRet == 0 ) - { - char *pBuffer = ogg_sync_buffer( &m_OggSync, 4096 ); - int iBytes = m_File.Read( pBuffer, 4096 ); - if( iBytes == 0 ) - return 0; - if( iBytes == -1 ) - { - sError = ssprintf( "error reading: %s", m_File.GetError().c_str() ); - return -1; - } - - ogg_sync_wrote( &m_OggSync, iBytes ); - } - } -} - -RString MovieDecoder_Theora::ProcessHeaders( theora_setup_info **pTheoraSetupInfo ) -{ - int iTheoraPacketsProcessed = 0; - while(1) - { - ogg_page OggPage; - RString sError; - int ret = ReadPage( &OggPage, sError, true ); - if( ret == 0 ) - return ssprintf( "error opening %s: EOF while searching for codec headers", m_File.GetPath().c_str() ); - if( ret<0 ) - return ssprintf( "error reading %s: %s", m_File.GetPath().c_str(), sError.c_str() ); - - if( m_OggStream.body_data == NULL ) - { - /* We don't have a stream yet. If this packet doesn't start a stream, - * then there aren't any Theora streams. */ - if( !ogg_page_bos(&OggPage) ) - return ssprintf( "error opening %s: no Theora streams found", m_File.GetPath().c_str() ); - - ogg_stream_init( &m_OggStream, ogg_page_serialno(&OggPage) ); - ogg_stream_pagein( &m_OggStream, &OggPage ); - ogg_packet op; - ogg_stream_packetout( &m_OggStream, &op ); - - if( theora_decode_headerin(&m_TheoraInfo, &m_TheoraComment, pTheoraSetupInfo, &op) < 0 ) - { - ogg_stream_clear( &m_OggStream ); - continue; - } - - /* We've found the Theora stream. */ - iTheoraPacketsProcessed++; - } - else - ogg_stream_pagein( &m_OggStream, &OggPage ); - - /* Look for more headers in this page. */ - while(1) - { - ogg_packet op; - int ret = ogg_stream_packetpeek( &m_OggStream, &op ); - if( ret == 0 ) - break; - if( ret < 0 ) - return ssprintf( "error opening %s: error parsing Theora stream headers", m_File.GetPath().c_str() ); - - if( !theora_packet_isheader(&op) ) - { - /* This is a body packet, not a header packet, so we're done processing - * headers. We must have at least three header packets. */ - if( iTheoraPacketsProcessed < 3 ) - return ssprintf( "error opening %s: error parsing Theora stream headers", m_File.GetPath().c_str() ); - return RString(); - } - - ret = theora_decode_headerin( &m_TheoraInfo, &m_TheoraComment, pTheoraSetupInfo, &op ); - if( ret < 0 ) - return ssprintf( "error opening %s: error parsing Theora stream headers", m_File.GetPath().c_str() ); - - ogg_stream_packetout( &m_OggStream, NULL ); - iTheoraPacketsProcessed++; - } - } -} - -RString MovieDecoder_Theora::Open( RString sFile ) -{ - if( !m_File.Open(sFile) ) - return ssprintf( "error opening %s: %s", sFile.c_str(), m_File.GetError().c_str() ); - - Init(); - - theora_setup_info *pTheoraSetupInfo = NULL; - RString sError = ProcessHeaders( &pTheoraSetupInfo ); - if( !sError.empty() ) - { - theora_setup_free( pTheoraSetupInfo ); - return sError; - } - - m_TheoraState = theora_decode_alloc( &m_TheoraInfo, pTheoraSetupInfo ); - theora_setup_free( pTheoraSetupInfo ); - - RString sOutput = ssprintf( "MovieDecoder_Theora: Opened \"%s\". Serial: 0x%08lx, FPS: %.02f", - m_File.GetPath().c_str(), m_OggStream.serialno, 1/GetFrameDuration() ); - -#if 1 - m_InputPixFmt = avcodec::PIX_FMT_YUV420P; -#else - switch( m_TheoraInfo.pixelformat ) - { - case OC_PF_420: - m_InputPixFmt = avcodec::PIX_FMT_YUV420P; - sOutput += ", Format: YUV420"; - break; - case OC_PF_422: - m_InputPixFmt = avcodec::PIX_FMT_YUV422P; - sOutput += ", Format: YUV422"; - break; - case OC_PF_444: - m_InputPixFmt = avcodec::PIX_FMT_YUV444P; - sOutput += ", Format: YUV444"; - break; - default: - return ssprintf( "error opening %s: unsupported pixel format %i", m_File.GetPath().c_str(), m_TheoraInfo.pixelformat ); - } -#endif - LOG->Trace( "%s", sOutput.c_str() ); - - { - theora_stripe_callback cb; - cb.ctx = this; - cb.stripe_decoded = DecodeStripeStub; - theora_decode_ctl( m_TheoraState, OC_DECCTL_SET_STRIPE_CB, &cb, sizeof(cb) ); - } - - return RString(); -} - -int MovieDecoder_Theora::GetFrame( RageSurface *pOut, float fTargetTime ) -{ - while(1) - { - ogg_packet op; - if( ogg_stream_packetout(&m_OggStream, &op) != 0 ) - { - bool bSkipThisFrame = false; - if( fTargetTime != -1 && - GetTimestamp() + GetFrameDuration() <= fTargetTime ) - { - ogg_int64_t iFrame = theora_granule_frame( m_TheoraState, op.granulepos ); - if( (iFrame % 2) == 0 ) - bSkipThisFrame = true; - } - - if( bSkipThisFrame ) - m_pSurface = NULL; - else - m_pSurface = pOut; - - theora_decode_packetin( m_TheoraState, &op, &m_iGranulepos ); - - m_pSurface = NULL; - - return 1; - } - - /* Read more data. */ - ogg_page OggPage; - RString sError; - int ret = ReadPage( &OggPage, sError, false ); - if( ret == 0 ) - return 0; - if( ret == -1 ) - { - LOG->Warn( "error reading %s: %s", m_File.GetPath().c_str(), sError.c_str() ); - return -1; - } - if( ret > 0 ) - ogg_stream_pagein( &m_OggStream, &OggPage ); - } -} - -RageSurface *MovieDecoder_Theora::CreateCompatibleSurface( int iTextureWidth, int iTextureHeight, bool bPreferHighColor, MovieDecoderPixelFormatYCbCr &fmtout ) -{ - return MovieTexture_FFMpeg::AVCodecCreateCompatibleSurface( iTextureWidth, iTextureHeight, bPreferHighColor, *ConvertValue(&m_OutputPixFmt) ); -} - -void MovieDecoder_Theora::DecodeStripeStub( void *pCtx, theora_ycbcr_buffer yuv, int yfrag0, int yfrag_end ) -{ - ((MovieDecoder_Theora *) pCtx)->DecodeStripe( yuv, yfrag0, yfrag_end ); -} - -void MovieDecoder_Theora::DecodeStripe( theora_ycbcr_buffer yuv, int yfrag0, int yfrag_end ) -{ - yfrag0 *= 8; - yfrag_end *= 8; - - /* If m_pSurface is NULL, we're skipping this frame. */ - if( m_pSurface != NULL ) - { - /* XXX: non-zero offset untested */ - int iYOffsetY = m_TheoraInfo.pic_y; - int iUVOffsetX = m_TheoraInfo.pic_x; - int iUVOffsetY = m_TheoraInfo.pic_y; - - iYOffsetY += yfrag0; - iUVOffsetY += yfrag0; - - if( m_InputPixFmt == avcodec::PIX_FMT_YUV420P || avcodec::PIX_FMT_YUV422P ) - iUVOffsetX /= 2; - if( m_InputPixFmt == avcodec::PIX_FMT_YUV420P ) - iUVOffsetY /= 2; - - avcodec::AVPicture YUVIn; - YUVIn.data[0] = yuv[0].data + m_TheoraInfo.pic_x + yuv[0].ystride*iYOffsetY; - YUVIn.data[1] = yuv[1].data + iUVOffsetX + yuv[1].ystride*iUVOffsetY; - YUVIn.data[2] = yuv[2].data + iUVOffsetX + yuv[2].ystride*iUVOffsetY; - YUVIn.data[3] = NULL; - YUVIn.linesize[0] = yuv[0].ystride; - YUVIn.linesize[1] = yuv[1].ystride; - YUVIn.linesize[2] = yuv[2].ystride; - YUVIn.linesize[3] = 0; - - avcodec::AVPicture RGBOut; - RGBOut.data[0] = (unsigned char *) m_pSurface->pixels; - RGBOut.linesize[0] = m_pSurface->pitch; - RGBOut.data[0] += RGBOut.linesize[0] * yfrag0; - - int iRows = (yfrag_end-yfrag0) + 1; - // sm4svn code: -#if defined(MACOSX) - avcodec::img_convert( &RGBOut, m_OutputPixFmt, - &YUVIn, m_InputPixFmt, - m_TheoraInfo.frame_width, iRows ); -#else - ConvertImage( YUVIn, RGBOut, iRows ); -#endif - } - - { - /* yfrag0 = 0 ... frame_height-1 */ - int iHalf = m_TheoraInfo.frame_height / 2; - if( yfrag0 < iHalf && yfrag_end+1 >= iHalf ) - { - float fFPS = (float)m_TheoraInfo.fps_numerator / m_TheoraInfo.fps_denominator; - if( fFPS <= 30.0001f ) - { -// LOG->Trace( "..." ); - float fSecondsPerFrame = 1/fFPS; - int iUsecPerFrame = int(fSecondsPerFrame * 1000000); -// usleep( iUsecPerFrame/2 ); - } - } - } -} - -float MovieDecoder_Theora::GetSourceAspectRatio() const -{ - return (float) m_TheoraInfo.aspect_numerator / m_TheoraInfo.aspect_denominator; -} - -float MovieDecoder_Theora::GetTimestamp() const -{ - return (float) theora_granule_time( const_cast(m_TheoraState), m_iGranulepos ); -} - -float MovieDecoder_Theora::GetFrameDuration() const -{ - return (float) m_TheoraInfo.fps_denominator / m_TheoraInfo.fps_numerator; -} - -void MovieDecoder_Theora::Close() -{ - ogg_stream_clear( &m_OggStream ); - theora_decode_free( m_TheoraState ); - m_TheoraState = NULL; - theora_comment_clear( &m_TheoraComment ); - theora_info_clear( &m_TheoraInfo ); - ogg_sync_clear( &m_OggSync ); -} -#endif - -class MovieTexture_Theora: public MovieTexture_Generic -{ -public: - MovieTexture_Theora( RageTextureID ID ); -}; - -MovieTexture_Theora::MovieTexture_Theora( RageTextureID ID ): - MovieTexture_Generic( ID, new MovieDecoder_Theora ) -{ -} - -RageMovieTexture *RageMovieTextureDriver_Theora::Create( RageTextureID ID, RString &sError ) -{ - MovieTexture_Theora *pRet = new MovieTexture_Theora( ID ); - sError = pRet->Init(); - if( !sError.empty() ) - SAFE_DELETE( pRet ); - return pRet; -} - -REGISTER_MOVIE_TEXTURE_CLASS( Theora ); - -/* - * (c) 2005 Glenn Maynard - * All rights reserved. - * - * 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, and/or sell copies of the Software, and to permit persons to - * whom the Software is furnished to do so, provided that the above - * copyright notice(s) and this permission notice appear in all copies of - * the Software and that both the above copyright notice(s) and this - * permission notice appear in supporting documentation. - * - * 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 OF - * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS - * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ diff --git a/src/arch/MovieTexture/MovieTexture_Theora.h b/src/arch/MovieTexture/MovieTexture_Theora.h deleted file mode 100644 index 3f04cdf62f..0000000000 --- a/src/arch/MovieTexture/MovieTexture_Theora.h +++ /dev/null @@ -1,39 +0,0 @@ -/* MovieTexture_Theora - Ogg Theora movie renderer. */ - -#ifndef RAGE_MOVIE_TEXTURE_THEORA_H -#define RAGE_MOVIE_TEXTURE_THEORA_H - -#include "MovieTexture_Generic.h" - -class RageMovieTextureDriver_Theora: public RageMovieTextureDriver -{ -public: - virtual RageMovieTexture *Create( RageTextureID ID, RString &sError ); -}; - -#endif - -/* - * (c) 2005 Glenn Maynard - * All rights reserved. - * - * 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, and/or sell copies of the Software, and to permit persons to - * whom the Software is furnished to do so, provided that the above - * copyright notice(s) and this permission notice appear in all copies of - * the Software and that both the above copyright notice(s) and this - * permission notice appear in supporting documentation. - * - * 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 OF - * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS - * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ diff --git a/src/arch/arch.cpp b/src/arch/arch.cpp index 5cbdcdcd02..7816b1c771 100644 --- a/src/arch/arch.cpp +++ b/src/arch/arch.cpp @@ -195,9 +195,6 @@ RageMovieTexture *MakeRageMovieTexture( RageTextureID ID ) { Driver = DriversToTry[i]; LOG->Trace( "Initializing driver: %s", Driver.c_str() ); -#ifdef USE_MOVIE_TEXTURE_THEORA - if( !Driver.CompareNoCase("Theora") ) ret = new MovieTexture_Theora(ID); -#endif #ifdef USE_MOVIE_TEXTURE_DSHOW if( !Driver.CompareNoCase("DShow") ) ret = new MovieTexture_DShow(ID); #endif diff --git a/src/arch/arch_default.h b/src/arch/arch_default.h index 4071e2f4ef..88e863fcfb 100644 --- a/src/arch/arch_default.h +++ b/src/arch/arch_default.h @@ -8,7 +8,7 @@ #include "LowLevelWindow/LowLevelWindow_Win32.h" #include "MemoryCard/MemoryCardDriverThreaded_Windows.h" #define DEFAULT_INPUT_DRIVER_LIST "DirectInput,Pump,Para" -#define DEFAULT_MOVIE_DRIVER_LIST "Theora,FFMpeg,DShow,Null" +#define DEFAULT_MOVIE_DRIVER_LIST "FFMpeg,DShow,Null" #define DEFAULT_SOUND_DRIVER_LIST "DirectSound-sw,WDMKS,WaveOut,Null" @@ -18,7 +18,7 @@ #include "LowLevelWindow/LowLevelWindow_MacOSX.h" #include "MemoryCard/MemoryCardDriverThreaded_MacOSX.h" #define DEFAULT_INPUT_DRIVER_LIST "HID" -#define DEFAULT_MOVIE_DRIVER_LIST "Theora,FFMpeg,Null" +#define DEFAULT_MOVIE_DRIVER_LIST "FFMpeg,Null" #define DEFAULT_SOUND_DRIVER_LIST "AudioUnit,Null" @@ -38,7 +38,7 @@ #else #define DEFAULT_INPUT_DRIVER_LIST "X11" #endif -#define DEFAULT_MOVIE_DRIVER_LIST "Theora,FFMpeg,Null" +#define DEFAULT_MOVIE_DRIVER_LIST "FFMpeg,Null" #define DEFAULT_SOUND_DRIVER_LIST "ALSA-sw,pulse,OSS,Null" #else #error Which arch? diff --git a/src/archutils/Darwin/arch_setup.h b/src/archutils/Darwin/arch_setup.h index 51a32fe99e..1a0df109e6 100644 --- a/src/archutils/Darwin/arch_setup.h +++ b/src/archutils/Darwin/arch_setup.h @@ -7,7 +7,6 @@ extern "C" int SM_main( int argc, char *argv[] ); #define HAVE_VERSION_INFO #define HAVE_CXA_DEMANGLE -#define HAVE_THEORA #define HAVE_FFMPEG #define HAVE_PTHREAD_COND_TIMEDWAIT /* This must be defined to 1 because autoconf's AC_CHECK_DECLS macro decides to define diff --git a/src/archutils/Win32/arch_setup.h b/src/archutils/Win32/arch_setup.h index 0b81211d7e..5e980524ea 100644 --- a/src/archutils/Win32/arch_setup.h +++ b/src/archutils/Win32/arch_setup.h @@ -2,7 +2,6 @@ #define ARCH_SETUP_WINDOWS_H #define HAVE_FFMPEG -#define HAVE_THEORA #define SUPPORT_OPENGL #define SUPPORT_D3D