* qatar/master: dwt: Drop unused functions spatial_compose{53|97}i() nutdec: Remove unused and broken debug function stub avcodec: Drop long-deprecated imgconvert.h header Add Opus support to the Ogg muxer. Add Opus codec id and codec description. avformat: Identify anonymous AVIO typedef structs. Conflicts: libavcodec/avcodec.h libavcodec/codec_desc.c libavcodec/imgconvert.h libavcodec/version.h libavformat/oggenc.c libavformat/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.1
@@ -423,6 +423,7 @@ enum AVCodecID { | |||||
AV_CODEC_ID_RALF, | AV_CODEC_ID_RALF, | ||||
AV_CODEC_ID_IAC, | AV_CODEC_ID_IAC, | ||||
AV_CODEC_ID_ILBC, | AV_CODEC_ID_ILBC, | ||||
AV_CODEC_ID_OPUS_DEPRECATED, | |||||
AV_CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'), | AV_CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'), | ||||
AV_CODEC_ID_8SVX_RAW = MKBETAG('8','S','V','X'), | AV_CODEC_ID_8SVX_RAW = MKBETAG('8','S','V','X'), | ||||
AV_CODEC_ID_SONIC = MKBETAG('S','O','N','C'), | AV_CODEC_ID_SONIC = MKBETAG('S','O','N','C'), | ||||
@@ -2242,7 +2242,8 @@ static const AVCodecDescriptor codec_descriptors[] = { | |||||
.id = AV_CODEC_ID_OPUS, | .id = AV_CODEC_ID_OPUS, | ||||
.type = AVMEDIA_TYPE_AUDIO, | .type = AVMEDIA_TYPE_AUDIO, | ||||
.name = "opus", | .name = "opus", | ||||
.long_name = NULL_IF_CONFIG_SMALL("Opus"), | |||||
.long_name = NULL_IF_CONFIG_SMALL("Opus (Opus Interactive Audio Codec)"), | |||||
.props = AV_CODEC_PROP_LOSSY, | |||||
}, | }, | ||||
/* subtitle codecs */ | /* subtitle codecs */ | ||||
@@ -468,15 +468,6 @@ static void spatial_compose53i_dy(DWTCompose *cs, IDWTELEM *buffer, | |||||
cs->y += 2; | cs->y += 2; | ||||
} | } | ||||
static void av_unused spatial_compose53i(IDWTELEM *buffer, IDWTELEM *temp, | |||||
int width, int height, int stride) | |||||
{ | |||||
DWTCompose cs; | |||||
spatial_compose53i_init(&cs, buffer, height, stride); | |||||
while (cs.y <= height) | |||||
spatial_compose53i_dy(&cs, buffer, temp, width, height, stride); | |||||
} | |||||
void ff_snow_horizontal_compose97i(IDWTELEM *b, IDWTELEM *temp, int width) | void ff_snow_horizontal_compose97i(IDWTELEM *b, IDWTELEM *temp, int width) | ||||
{ | { | ||||
const int w2 = (width + 1) >> 1; | const int w2 = (width + 1) >> 1; | ||||
@@ -651,15 +642,6 @@ static void spatial_compose97i_dy(DWTCompose *cs, IDWTELEM *buffer, | |||||
cs->y += 2; | cs->y += 2; | ||||
} | } | ||||
static void av_unused spatial_compose97i(IDWTELEM *buffer, IDWTELEM *temp, | |||||
int width, int height, int stride) | |||||
{ | |||||
DWTCompose cs; | |||||
spatial_compose97i_init(&cs, buffer, height, stride); | |||||
while (cs.y <= height) | |||||
spatial_compose97i_dy(&cs, buffer, temp, width, height, stride); | |||||
} | |||||
void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer *sb, int width, | void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer *sb, int width, | ||||
int height, int stride_line, int type, | int height, int stride_line, int type, | ||||
int decomposition_count) | int decomposition_count) | ||||
@@ -33,7 +33,6 @@ | |||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "dsputil.h" | #include "dsputil.h" | ||||
#include "internal.h" | #include "internal.h" | ||||
#include "imgconvert.h" | |||||
#include "libavutil/colorspace.h" | #include "libavutil/colorspace.h" | ||||
#include "libavutil/common.h" | #include "libavutil/common.h" | ||||
#include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||
@@ -1,44 +0,0 @@ | |||||
/* | |||||
* Misc image conversion routines | |||||
* most functionality is exported to the public API, see avcodec.h | |||||
* | |||||
* Copyright (c) 2008 Vitor Sessak | |||||
* | |||||
* This file is part of FFmpeg. | |||||
* | |||||
* FFmpeg is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 2.1 of the License, or (at your option) any later version. | |||||
* | |||||
* FFmpeg is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public | |||||
* License along with FFmpeg; if not, write to the Free Software | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
*/ | |||||
#ifndef AVCODEC_IMGCONVERT_H | |||||
#define AVCODEC_IMGCONVERT_H | |||||
#include <stdint.h> | |||||
#include "avcodec.h" | |||||
#if LIBAVCODEC_VERSION_MAJOR < 53 | |||||
attribute_deprecated | |||||
int ff_fill_linesize(AVPicture *picture, enum PixelFormat pix_fmt, int width); | |||||
attribute_deprecated | |||||
int ff_fill_pointer(AVPicture *picture, uint8_t *ptr, enum PixelFormat pix_fmt, int height); | |||||
attribute_deprecated | |||||
int ff_get_plane_bytewidth(enum PixelFormat pix_fmt, int width, int plane); | |||||
attribute_deprecated | |||||
int ff_set_systematic_pal(uint32_t pal[256], enum PixelFormat pix_fmt); | |||||
#endif | |||||
#endif /* AVCODEC_IMGCONVERT_H */ |
@@ -25,7 +25,6 @@ | |||||
*/ | */ | ||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "imgconvert.h" | |||||
#include "raw.h" | #include "raw.h" | ||||
#include "libavutil/avassert.h" | #include "libavutil/avassert.h" | ||||
#include "libavutil/common.h" | #include "libavutil/common.h" | ||||
@@ -38,7 +38,6 @@ | |||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "dsputil.h" | #include "dsputil.h" | ||||
#include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
#include "imgconvert.h" | |||||
#include "thread.h" | #include "thread.h" | ||||
#include "frame_thread_encoder.h" | #include "frame_thread_encoder.h" | ||||
#include "audioconvert.h" | #include "audioconvert.h" | ||||
@@ -1848,6 +1847,7 @@ static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id) | |||||
//This is for future deprecatec codec ids, its empty since | //This is for future deprecatec codec ids, its empty since | ||||
//last major bump but will fill up again over time, please don't remove it | //last major bump but will fill up again over time, please don't remove it | ||||
// case AV_CODEC_ID_UTVIDEO_DEPRECATED: return AV_CODEC_ID_UTVIDEO; | // case AV_CODEC_ID_UTVIDEO_DEPRECATED: return AV_CODEC_ID_UTVIDEO; | ||||
case AV_CODEC_ID_OPUS_DEPRECATED: return AV_CODEC_ID_OPUS; | |||||
default : return id; | default : return id; | ||||
} | } | ||||
} | } | ||||
@@ -27,7 +27,7 @@ | |||||
*/ | */ | ||||
#define LIBAVCODEC_VERSION_MAJOR 54 | #define LIBAVCODEC_VERSION_MAJOR 54 | ||||
#define LIBAVCODEC_VERSION_MINOR 59 | |||||
#define LIBAVCODEC_VERSION_MINOR 60 | |||||
#define LIBAVCODEC_VERSION_MICRO 100 | #define LIBAVCODEC_VERSION_MICRO 100 | ||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||
@@ -48,7 +48,7 @@ | |||||
* new elements have been added after this struct in AVFormatContext | * new elements have been added after this struct in AVFormatContext | ||||
* or AVIOContext. | * or AVIOContext. | ||||
*/ | */ | ||||
typedef struct { | |||||
typedef struct AVIOInterruptCB { | |||||
int (*callback)(void*); | int (*callback)(void*); | ||||
void *opaque; | void *opaque; | ||||
} AVIOInterruptCB; | } AVIOInterruptCB; | ||||
@@ -65,7 +65,7 @@ typedef struct { | |||||
* when implementing custom I/O. Normally these are set to the | * when implementing custom I/O. Normally these are set to the | ||||
* function pointers specified in avio_alloc_context() | * function pointers specified in avio_alloc_context() | ||||
*/ | */ | ||||
typedef struct { | |||||
typedef struct AVIOContext { | |||||
/** | /** | ||||
* A class for private options. | * A class for private options. | ||||
* | * | ||||
@@ -349,6 +349,35 @@ static int ogg_build_speex_headers(AVCodecContext *avctx, | |||||
return 0; | return 0; | ||||
} | } | ||||
#define OPUS_HEADER_SIZE 19 | |||||
static int ogg_build_opus_headers(AVCodecContext *avctx, | |||||
OGGStreamContext *oggstream, int bitexact, | |||||
AVDictionary **m) | |||||
{ | |||||
uint8_t *p; | |||||
if (avctx->extradata_size < OPUS_HEADER_SIZE) | |||||
return -1; | |||||
/* first packet: Opus header */ | |||||
p = av_mallocz(avctx->extradata_size); | |||||
if (!p) | |||||
return AVERROR(ENOMEM); | |||||
oggstream->header[0] = p; | |||||
oggstream->header_len[0] = avctx->extradata_size; | |||||
bytestream_put_buffer(&p, avctx->extradata, avctx->extradata_size); | |||||
/* second packet: VorbisComment */ | |||||
p = ogg_write_vorbiscomment(8, bitexact, &oggstream->header_len[1], m, 0); | |||||
if (!p) | |||||
return AVERROR(ENOMEM); | |||||
oggstream->header[1] = p; | |||||
bytestream_put_buffer(&p, "OpusTags", 8); | |||||
return 0; | |||||
} | |||||
static int ogg_write_header(AVFormatContext *s) | static int ogg_write_header(AVFormatContext *s) | ||||
{ | { | ||||
OGGStreamContext *oggstream; | OGGStreamContext *oggstream; | ||||
@@ -359,13 +388,18 @@ static int ogg_write_header(AVFormatContext *s) | |||||
unsigned serial_num = i; | unsigned serial_num = i; | ||||
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) | if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) | ||||
avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); | |||||
if (st->codec->codec_id == AV_CODEC_ID_OPUS) | |||||
/* Opus requires a fixed 48kHz clock */ | |||||
avpriv_set_pts_info(st, 64, 1, 48000); | |||||
else | |||||
avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); | |||||
else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) | else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) | ||||
avpriv_set_pts_info(st, 64, st->codec->time_base.num, st->codec->time_base.den); | avpriv_set_pts_info(st, 64, st->codec->time_base.num, st->codec->time_base.den); | ||||
if (st->codec->codec_id != AV_CODEC_ID_VORBIS && | if (st->codec->codec_id != AV_CODEC_ID_VORBIS && | ||||
st->codec->codec_id != AV_CODEC_ID_THEORA && | st->codec->codec_id != AV_CODEC_ID_THEORA && | ||||
st->codec->codec_id != AV_CODEC_ID_SPEEX && | st->codec->codec_id != AV_CODEC_ID_SPEEX && | ||||
st->codec->codec_id != AV_CODEC_ID_FLAC) { | |||||
st->codec->codec_id != AV_CODEC_ID_FLAC && | |||||
st->codec->codec_id != AV_CODEC_ID_OPUS) { | |||||
av_log(s, AV_LOG_ERROR, "Unsupported codec id in stream %d\n", i); | av_log(s, AV_LOG_ERROR, "Unsupported codec id in stream %d\n", i); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -407,6 +441,15 @@ static int ogg_write_header(AVFormatContext *s) | |||||
av_freep(&st->priv_data); | av_freep(&st->priv_data); | ||||
return err; | return err; | ||||
} | } | ||||
} else if (st->codec->codec_id == AV_CODEC_ID_OPUS) { | |||||
int err = ogg_build_opus_headers(st->codec, oggstream, | |||||
st->codec->flags & CODEC_FLAG_BITEXACT, | |||||
&s->metadata); | |||||
if (err) { | |||||
av_log(s, AV_LOG_ERROR, "Error writing Opus headers\n"); | |||||
av_freep(&st->priv_data); | |||||
return err; | |||||
} | |||||
} else { | } else { | ||||
uint8_t *p; | uint8_t *p; | ||||
const char *cstr = st->codec->codec_id == AV_CODEC_ID_VORBIS ? "vorbis" : "theora"; | const char *cstr = st->codec->codec_id == AV_CODEC_ID_VORBIS ? "vorbis" : "theora"; | ||||
@@ -503,7 +546,9 @@ static int ogg_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||
pframe_count = 0; | pframe_count = 0; | ||||
} | } | ||||
granule = (oggstream->last_kf_pts<<oggstream->kfgshift) | pframe_count; | granule = (oggstream->last_kf_pts<<oggstream->kfgshift) | pframe_count; | ||||
} else | |||||
} else if (st->codec->codec_id == AV_CODEC_ID_OPUS) | |||||
granule = pkt->pts + pkt->duration + av_rescale_q(st->codec->delay, (AVRational){ 1, st->codec->sample_rate }, st->time_base); | |||||
else | |||||
granule = pkt->pts + pkt->duration; | granule = pkt->pts + pkt->duration; | ||||
ret = ogg_buffer_data(s, st, pkt->data, pkt->size, granule, 0); | ret = ogg_buffer_data(s, st, pkt->data, pkt->size, granule, 0); | ||||
@@ -531,7 +576,8 @@ static int ogg_write_trailer(AVFormatContext *s) | |||||
AVStream *st = s->streams[i]; | AVStream *st = s->streams[i]; | ||||
OGGStreamContext *oggstream = st->priv_data; | OGGStreamContext *oggstream = st->priv_data; | ||||
if (st->codec->codec_id == AV_CODEC_ID_FLAC || | if (st->codec->codec_id == AV_CODEC_ID_FLAC || | ||||
st->codec->codec_id == AV_CODEC_ID_SPEEX) { | |||||
st->codec->codec_id == AV_CODEC_ID_SPEEX || | |||||
st->codec->codec_id == AV_CODEC_ID_OPUS) { | |||||
av_freep(&oggstream->header[0]); | av_freep(&oggstream->header[0]); | ||||
} | } | ||||
av_freep(&oggstream->header[1]); | av_freep(&oggstream->header[1]); | ||||
@@ -544,7 +590,7 @@ AVOutputFormat ff_ogg_muxer = { | |||||
.name = "ogg", | .name = "ogg", | ||||
.long_name = NULL_IF_CONFIG_SMALL("Ogg"), | .long_name = NULL_IF_CONFIG_SMALL("Ogg"), | ||||
.mime_type = "application/ogg", | .mime_type = "application/ogg", | ||||
.extensions = "ogg,ogv,spx", | |||||
.extensions = "ogg,ogv,spx,opus", | |||||
.priv_data_size = sizeof(OGGContext), | .priv_data_size = sizeof(OGGContext), | ||||
.audio_codec = AV_CODEC_ID_FLAC, | .audio_codec = AV_CODEC_ID_FLAC, | ||||
.video_codec = AV_CODEC_ID_THEORA, | .video_codec = AV_CODEC_ID_THEORA, | ||||
@@ -31,7 +31,7 @@ | |||||
#define LIBAVFORMAT_VERSION_MAJOR 54 | #define LIBAVFORMAT_VERSION_MAJOR 54 | ||||
#define LIBAVFORMAT_VERSION_MINOR 29 | #define LIBAVFORMAT_VERSION_MINOR 29 | ||||
#define LIBAVFORMAT_VERSION_MICRO 104 | |||||
#define LIBAVFORMAT_VERSION_MICRO 105 | |||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||
LIBAVFORMAT_VERSION_MINOR, \ | LIBAVFORMAT_VERSION_MINOR, \ | ||||