* 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, \ | ||||