Merge remote-tracking branch 'qatar/master'
* qatar/master: mingw/cygwin: Stop adding -fno-common to gcc CFLAGS Restructure av_log_missing_feature message rtp: Support packetization/depacketization of opus file: Set the return value type for lseek to int64_t. ppc: fix Altivec build with old compilers build: add LTO support for PGI compiler build: add -Mdse to PGI optimisation flags rtpenc_vp8: Update the packetizer to the latest spec version rtpdec_vp8: Make the depacketizer implement the latest spec draft doc: allow building with old texi2html versions avutil: skip old_pix_fmts.h since it is just a list Conflicts: libavcodec/aacdec.c libavcodec/h264.c libavcodec/ppc/fmtconvert_altivec.c libavcodec/utils.c libavformat/file.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		
							
								
								
									
										5
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								configure
									
									
									
									
										vendored
									
									
								
							@@ -2429,6 +2429,7 @@ msvc_flags(){
 | 
			
		||||
pgi_flags(){
 | 
			
		||||
    for flag; do
 | 
			
		||||
        case $flag in
 | 
			
		||||
            -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
 | 
			
		||||
            -fomit-frame-pointer) echo -Mnoframe ;;
 | 
			
		||||
            -g)                   echo -gopt ;;
 | 
			
		||||
            *)                    echo $flag ;;
 | 
			
		||||
@@ -2607,7 +2608,7 @@ probe_cc(){
 | 
			
		||||
    elif $_cc -V 2>&1 | grep -q Portland; then
 | 
			
		||||
        _type=pgi
 | 
			
		||||
        _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
 | 
			
		||||
        opt_common='-alias=ansi -Mlre -Mpre'
 | 
			
		||||
        opt_common='-alias=ansi -Mdse -Mlre -Mpre'
 | 
			
		||||
        _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
 | 
			
		||||
        _cflags_size="-O2 -Munroll=c:1 $opt_common"
 | 
			
		||||
        _cflags_noopt="-O1"
 | 
			
		||||
@@ -3109,7 +3110,6 @@ case $target_os in
 | 
			
		||||
        objformat="win32"
 | 
			
		||||
        ranlib=:
 | 
			
		||||
        enable dos_paths
 | 
			
		||||
        check_cflags -fno-common
 | 
			
		||||
        add_cppflags -U__STRICT_ANSI__
 | 
			
		||||
        ;;
 | 
			
		||||
    cygwin*)
 | 
			
		||||
@@ -3125,7 +3125,6 @@ case $target_os in
 | 
			
		||||
        SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
 | 
			
		||||
        objformat="win32"
 | 
			
		||||
        enable dos_paths
 | 
			
		||||
        check_cflags -fno-common
 | 
			
		||||
        add_cppflags -U__STRICT_ANSI__
 | 
			
		||||
        ;;
 | 
			
		||||
    *-dos|freedos|opendos)
 | 
			
		||||
 
 | 
			
		||||
@@ -145,7 +145,8 @@ $print_page_foot = \&FFmpeg_print_page_foot;
 | 
			
		||||
sub FFmpeg_print_page_foot($$)
 | 
			
		||||
{
 | 
			
		||||
    my $fh = shift;
 | 
			
		||||
    my $program_string = T2H_DEFAULT_program_string();
 | 
			
		||||
    my $program_string = defined &T2H_DEFAULT_program_string ?
 | 
			
		||||
        T2H_DEFAULT_program_string() : program_string();
 | 
			
		||||
    print $fh '<footer class="footer pagination-right">' . "\n";
 | 
			
		||||
    print $fh '<span class="label label-info">' . $program_string;
 | 
			
		||||
    print $fh "</span></footer></div>\n";
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ static int aac_adtstoasc_filter(AVBitStreamFilterContext *bsfc,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!hdr.crc_absent && hdr.num_aac_frames > 1) {
 | 
			
		||||
        av_log_missing_feature(avctx, "Multiple RDBs per frame with CRC is", 0);
 | 
			
		||||
        av_log_missing_feature(avctx, "Multiple RDBs per frame with CRC", 0);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -74,7 +74,7 @@ static int aac_adtstoasc_filter(AVBitStreamFilterContext *bsfc,
 | 
			
		||||
        if (!hdr.chan_config) {
 | 
			
		||||
            init_get_bits(&gb, buf, buf_size * 8);
 | 
			
		||||
            if (get_bits(&gb, 3) != 5) {
 | 
			
		||||
                av_log_missing_feature(avctx, "PCE based channel configuration, where the PCE is not the first syntax element is", 0);
 | 
			
		||||
                av_log_missing_feature(avctx, "PCE based channel configuration, where the PCE is not the first syntax element", 0);
 | 
			
		||||
                return -1;
 | 
			
		||||
            }
 | 
			
		||||
            init_put_bits(&pb, pce_data, MAX_PCE_SIZE);
 | 
			
		||||
 
 | 
			
		||||
@@ -665,7 +665,7 @@ static int decode_ga_specific_config(AACContext *ac, AVCodecContext *avctx,
 | 
			
		||||
    int tags = 0;
 | 
			
		||||
 | 
			
		||||
    if (get_bits1(gb)) { // frameLengthFlag
 | 
			
		||||
        av_log_missing_feature(avctx, "960/120 MDCT window is", 1);
 | 
			
		||||
        av_log_missing_feature(avctx, "960/120 MDCT window", 1);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -2388,7 +2388,7 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
 | 
			
		||||
        if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) {
 | 
			
		||||
            // This is 2 for "VLB " audio in NSV files.
 | 
			
		||||
            // See samples/nsv/vlb_audio.
 | 
			
		||||
            av_log_missing_feature(ac->avctx, "More than one AAC RDB per ADTS frame is", 0);
 | 
			
		||||
            av_log_missing_feature(ac->avctx, "More than one AAC RDB per ADTS frame", 0);
 | 
			
		||||
            ac->warned_num_aac_frames = 1;
 | 
			
		||||
        }
 | 
			
		||||
        push_output_configuration(ac);
 | 
			
		||||
@@ -2728,8 +2728,8 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
 | 
			
		||||
        asclen         = get_bits_left(gb);
 | 
			
		||||
 | 
			
		||||
    if (config_start_bit % 8) {
 | 
			
		||||
        av_log_missing_feature(latmctx->aac_ctx.avctx, "audio specific "
 | 
			
		||||
                               "config not byte aligned.\n", 1);
 | 
			
		||||
        av_log_missing_feature(latmctx->aac_ctx.avctx,
 | 
			
		||||
                               "Non-byte-aligned audio-specific config", 1);
 | 
			
		||||
        return AVERROR_INVALIDDATA;
 | 
			
		||||
    }
 | 
			
		||||
    if (asclen <= 0)
 | 
			
		||||
@@ -2789,7 +2789,7 @@ static int read_stream_mux_config(struct LATMContext *latmctx,
 | 
			
		||||
        // numPrograms
 | 
			
		||||
        if (get_bits(gb, 4)) {                  // numPrograms
 | 
			
		||||
            av_log_missing_feature(latmctx->aac_ctx.avctx,
 | 
			
		||||
                                   "multiple programs are not supported\n", 1);
 | 
			
		||||
                                   "multiple programs", 1);
 | 
			
		||||
            return AVERROR_PATCHWELCOME;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -2798,7 +2798,7 @@ static int read_stream_mux_config(struct LATMContext *latmctx,
 | 
			
		||||
        // for each layer (which there is only one in DVB)
 | 
			
		||||
        if (get_bits(gb, 3)) {                   // numLayer
 | 
			
		||||
            av_log_missing_feature(latmctx->aac_ctx.avctx,
 | 
			
		||||
                                   "multiple layers are not supported\n", 1);
 | 
			
		||||
                                   "multiple layers", 1);
 | 
			
		||||
            return AVERROR_PATCHWELCOME;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1077,7 +1077,7 @@ static int decode_seq_header(AVSContext *h) {
 | 
			
		||||
    width  = get_bits(&s->gb, 14);
 | 
			
		||||
    height = get_bits(&s->gb, 14);
 | 
			
		||||
    if ((s->width || s->height) && (s->width != width || s->height != height)) {
 | 
			
		||||
        av_log_missing_feature(s, "Width/height changing in CAVS is", 0);
 | 
			
		||||
        av_log_missing_feature(s, "Width/height changing in CAVS", 0);
 | 
			
		||||
        return AVERROR_PATCHWELCOME;
 | 
			
		||||
    }
 | 
			
		||||
    if (width <= 0 || height <= 0) {
 | 
			
		||||
 
 | 
			
		||||
@@ -2451,7 +2451,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
 | 
			
		||||
 | 
			
		||||
    if(must_reinit && (h != h0 || (s->avctx->active_thread_type & FF_THREAD_FRAME))) {
 | 
			
		||||
        av_log_missing_feature(s->avctx,
 | 
			
		||||
                                "Width/height/bit depth/chroma idc changing with threads is", 0);
 | 
			
		||||
                                "Width/height/bit depth/chroma idc changing with threads", 0);
 | 
			
		||||
        return AVERROR_PATCHWELCOME;   // width / height changed during parallelized decoding
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -256,8 +256,8 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
 | 
			
		||||
    }
 | 
			
		||||
    if (s->ls && !(s->bits <= 8 || nb_components == 1)) {
 | 
			
		||||
        av_log_missing_feature(s->avctx,
 | 
			
		||||
                               "only <= 8 bits/component or "
 | 
			
		||||
                               "16-bit gray accepted for JPEG-LS\n", 0);
 | 
			
		||||
                               "For JPEG-LS anything except <= 8 bits/component"
 | 
			
		||||
                               " or 16-bit gray", 0);
 | 
			
		||||
        return AVERROR_PATCHWELCOME;
 | 
			
		||||
    }
 | 
			
		||||
    s->nb_components = nb_components;
 | 
			
		||||
@@ -286,8 +286,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
 | 
			
		||||
        av_log_missing_feature(s->avctx,
 | 
			
		||||
                               "Subsampling in JPEG-LS is not supported.\n", 0);
 | 
			
		||||
        av_log_missing_feature(s->avctx, "Subsampling in JPEG-LS", 0);
 | 
			
		||||
        return AVERROR_PATCHWELCOME;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,12 @@ static void float_to_int16_altivec(int16_t *dst, const float *src, long len)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define VSTE_INC(dst, v, elem, inc) do {                \
 | 
			
		||||
        vector signed short s = vec_splat(v, elem);     \
 | 
			
		||||
        vec_ste(s, 0, dst);                             \
 | 
			
		||||
        dst += inc;                                     \
 | 
			
		||||
    } while (0)
 | 
			
		||||
 | 
			
		||||
static void float_to_int16_stride_altivec(int16_t *dst, const float *src,
 | 
			
		||||
                                          long len, int stride)
 | 
			
		||||
{
 | 
			
		||||
@@ -91,22 +97,14 @@ static void float_to_int16_stride_altivec(int16_t *dst, const float *src,
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < len - 7; i += 8) {
 | 
			
		||||
        d = float_to_int16_one_altivec(src + i);
 | 
			
		||||
 | 
			
		||||
#define ASSIGN_S_VEC_SPLAT_D(j) \
 | 
			
		||||
        s = vec_splat(d, j); \
 | 
			
		||||
        vec_ste(s, 0, dst); \
 | 
			
		||||
        dst += stride
 | 
			
		||||
 | 
			
		||||
        ASSIGN_S_VEC_SPLAT_D(0);
 | 
			
		||||
        ASSIGN_S_VEC_SPLAT_D(1);
 | 
			
		||||
        ASSIGN_S_VEC_SPLAT_D(2);
 | 
			
		||||
        ASSIGN_S_VEC_SPLAT_D(3);
 | 
			
		||||
        ASSIGN_S_VEC_SPLAT_D(4);
 | 
			
		||||
        ASSIGN_S_VEC_SPLAT_D(5);
 | 
			
		||||
        ASSIGN_S_VEC_SPLAT_D(6);
 | 
			
		||||
        ASSIGN_S_VEC_SPLAT_D(7);
 | 
			
		||||
 | 
			
		||||
#undef ASSIGN_S_VEC_SPLAT_D
 | 
			
		||||
        VSTE_INC(dst, d, 0, stride);
 | 
			
		||||
        VSTE_INC(dst, d, 1, stride);
 | 
			
		||||
        VSTE_INC(dst, d, 2, stride);
 | 
			
		||||
        VSTE_INC(dst, d, 3, stride);
 | 
			
		||||
        VSTE_INC(dst, d, 4, stride);
 | 
			
		||||
        VSTE_INC(dst, d, 5, stride);
 | 
			
		||||
        VSTE_INC(dst, d, 6, stride);
 | 
			
		||||
        VSTE_INC(dst, d, 7, stride);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2429,7 +2429,7 @@ int ff_match_2uint16(const uint16_t(*tab)[2], int size, int a, int b)
 | 
			
		||||
 | 
			
		||||
void av_log_missing_feature(void *avc, const char *feature, int want_sample)
 | 
			
		||||
{
 | 
			
		||||
    av_log(avc, AV_LOG_WARNING, "%s not implemented. Update your FFmpeg "
 | 
			
		||||
    av_log(avc, AV_LOG_WARNING, "%s is not implemented. Update your FFmpeg "
 | 
			
		||||
            "version to the newest one from Git. If the problem still "
 | 
			
		||||
            "occurs, it means that your file has a feature which has not "
 | 
			
		||||
            "been implemented.\n", feature);
 | 
			
		||||
 
 | 
			
		||||
@@ -135,7 +135,7 @@ static int file_open(URLContext *h, const char *filename, int flags)
 | 
			
		||||
static int64_t file_seek(URLContext *h, int64_t pos, int whence)
 | 
			
		||||
{
 | 
			
		||||
    FileContext *c = h->priv_data;
 | 
			
		||||
    off_t ret;
 | 
			
		||||
    int64_t ret;
 | 
			
		||||
 | 
			
		||||
    if (whence == AVSEEK_SIZE) {
 | 
			
		||||
        struct stat st;
 | 
			
		||||
 
 | 
			
		||||
@@ -75,8 +75,8 @@ static int skeleton_header(AVFormatContext *s, int idx)
 | 
			
		||||
        target_idx = ogg_find_stream(ogg, AV_RL32(buf+12));
 | 
			
		||||
        start_granule = AV_RL64(buf+36);
 | 
			
		||||
        if (os->start_granule != OGG_NOGRANULE_VALUE) {
 | 
			
		||||
            av_log_missing_feature(s, "multiple fisbone for the "
 | 
			
		||||
                                      "same stream\n", 0);
 | 
			
		||||
            av_log_missing_feature(s,
 | 
			
		||||
                                   "multiple fisbone for the same stream", 0);
 | 
			
		||||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
        if (target_idx >= 0 && start_granule != OGG_NOGRANULE_VALUE) {
 | 
			
		||||
 
 | 
			
		||||
@@ -55,6 +55,12 @@ static RTPDynamicProtocolHandler speex_dynamic_handler = {
 | 
			
		||||
    .codec_id         = AV_CODEC_ID_SPEEX,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static RTPDynamicProtocolHandler opus_dynamic_handler = {
 | 
			
		||||
    .enc_name         = "opus",
 | 
			
		||||
    .codec_type       = AVMEDIA_TYPE_AUDIO,
 | 
			
		||||
    .codec_id         = AV_CODEC_ID_OPUS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* statistics functions */
 | 
			
		||||
static RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL;
 | 
			
		||||
 | 
			
		||||
@@ -85,6 +91,7 @@ void av_register_rtp_dynamic_payload_handlers(void)
 | 
			
		||||
    ff_register_dynamic_payload_handler(&ff_qcelp_dynamic_handler);
 | 
			
		||||
    ff_register_dynamic_payload_handler(&realmedia_mp3_dynamic_handler);
 | 
			
		||||
    ff_register_dynamic_payload_handler(&speex_dynamic_handler);
 | 
			
		||||
    ff_register_dynamic_payload_handler(&opus_dynamic_handler);
 | 
			
		||||
 | 
			
		||||
    ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler);
 | 
			
		||||
    ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * RTP VP8 Depacketizer
 | 
			
		||||
 * Copyright (c) 2010 Josh Allmann
 | 
			
		||||
 * Copyright (c) 2012 Martin Storsjo
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of FFmpeg.
 | 
			
		||||
 *
 | 
			
		||||
@@ -23,7 +24,7 @@
 | 
			
		||||
 * @file
 | 
			
		||||
 * @brief RTP support for the VP8 payload
 | 
			
		||||
 * @author Josh Allmann <joshua.allmann@gmail.com>
 | 
			
		||||
 * @see http://www.webmproject.org/code/specs/rtp/
 | 
			
		||||
 * @see http://tools.ietf.org/html/draft-ietf-payload-vp8-05
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "libavcodec/bytestream.h"
 | 
			
		||||
@@ -33,14 +34,12 @@
 | 
			
		||||
struct PayloadContext {
 | 
			
		||||
    AVIOContext *data;
 | 
			
		||||
    uint32_t       timestamp;
 | 
			
		||||
    int is_keyframe;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void prepare_packet(AVPacket *pkt, PayloadContext *vp8, int stream)
 | 
			
		||||
{
 | 
			
		||||
    av_init_packet(pkt);
 | 
			
		||||
    pkt->stream_index = stream;
 | 
			
		||||
    pkt->flags        = vp8->is_keyframe ? AV_PKT_FLAG_KEY : 0;
 | 
			
		||||
    pkt->size         = avio_close_dyn_buf(vp8->data, &pkt->data);
 | 
			
		||||
    pkt->destruct     = av_destruct_packet;
 | 
			
		||||
    vp8->data         = NULL;
 | 
			
		||||
@@ -54,70 +53,84 @@ static int vp8_handle_packet(AVFormatContext *ctx,
 | 
			
		||||
                             const uint8_t *buf,
 | 
			
		||||
                             int len, int flags)
 | 
			
		||||
{
 | 
			
		||||
    int start_packet, end_packet, has_au, ret = AVERROR(EAGAIN);
 | 
			
		||||
    int start_partition, end_packet;
 | 
			
		||||
    int extended_bits, non_ref, part_id;
 | 
			
		||||
    int pictureid_present = 0, tl0picidx_present = 0, tid_present = 0,
 | 
			
		||||
        keyidx_present = 0;
 | 
			
		||||
    int pictureid = -1, keyidx = -1;
 | 
			
		||||
 | 
			
		||||
    if (!buf) {
 | 
			
		||||
        // only called when vp8_handle_packet returns 1
 | 
			
		||||
        if (!vp8->data) {
 | 
			
		||||
            av_log(ctx, AV_LOG_ERROR, "Invalid VP8 data passed\n");
 | 
			
		||||
            return AVERROR_INVALIDDATA;
 | 
			
		||||
        }
 | 
			
		||||
        prepare_packet(pkt, vp8, st->index);
 | 
			
		||||
        *timestamp = vp8->timestamp;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    if (len < 1)
 | 
			
		||||
        return AVERROR_INVALIDDATA;
 | 
			
		||||
 | 
			
		||||
    start_packet = *buf & 1;
 | 
			
		||||
    end_packet   = flags & RTP_FLAG_MARKER;
 | 
			
		||||
    has_au       = *buf & 2;
 | 
			
		||||
    extended_bits   = buf[0] & 0x80;
 | 
			
		||||
    non_ref         = buf[0] & 0x20;
 | 
			
		||||
    start_partition = buf[0] & 0x10;
 | 
			
		||||
    part_id         = buf[0] & 0x0f;
 | 
			
		||||
    end_packet      = flags & RTP_FLAG_MARKER;
 | 
			
		||||
    buf++;
 | 
			
		||||
    len--;
 | 
			
		||||
    if (extended_bits) {
 | 
			
		||||
        if (len < 1)
 | 
			
		||||
            return AVERROR_INVALIDDATA;
 | 
			
		||||
        pictureid_present = buf[0] & 0x80;
 | 
			
		||||
        tl0picidx_present = buf[0] & 0x40;
 | 
			
		||||
        tid_present       = buf[0] & 0x20;
 | 
			
		||||
        keyidx_present    = buf[0] & 0x10;
 | 
			
		||||
        buf++;
 | 
			
		||||
        len--;
 | 
			
		||||
    }
 | 
			
		||||
    if (pictureid_present) {
 | 
			
		||||
        if (len < 1)
 | 
			
		||||
            return AVERROR_INVALIDDATA;
 | 
			
		||||
        if (buf[0] & 0x80) {
 | 
			
		||||
            if (len < 2)
 | 
			
		||||
                return AVERROR_INVALIDDATA;
 | 
			
		||||
            pictureid = AV_RB16(buf) & 0x7fff;
 | 
			
		||||
            buf += 2;
 | 
			
		||||
            len -= 2;
 | 
			
		||||
        } else {
 | 
			
		||||
            pictureid = buf[0] & 0x7f;
 | 
			
		||||
            buf++;
 | 
			
		||||
            len--;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (tl0picidx_present) {
 | 
			
		||||
        // Ignoring temporal level zero index
 | 
			
		||||
        buf++;
 | 
			
		||||
        len--;
 | 
			
		||||
    }
 | 
			
		||||
    if (tid_present || keyidx_present) {
 | 
			
		||||
        // Ignoring temporal layer index and layer sync bit
 | 
			
		||||
        if (len < 1)
 | 
			
		||||
            return AVERROR_INVALIDDATA;
 | 
			
		||||
        if (keyidx_present)
 | 
			
		||||
            keyidx = buf[0] & 0x1f;
 | 
			
		||||
        buf++;
 | 
			
		||||
        len--;
 | 
			
		||||
    }
 | 
			
		||||
    if (len < 1)
 | 
			
		||||
        return AVERROR_INVALIDDATA;
 | 
			
		||||
 | 
			
		||||
    if (start_packet) {
 | 
			
		||||
    if (start_partition && part_id == 0) {
 | 
			
		||||
        int res;
 | 
			
		||||
        uint32_t ts = *timestamp;
 | 
			
		||||
        if (vp8->data) {
 | 
			
		||||
            // missing end marker; return old frame anyway. untested
 | 
			
		||||
            prepare_packet(pkt, vp8, st->index);
 | 
			
		||||
            *timestamp = vp8->timestamp; // reset timestamp from old frame
 | 
			
		||||
 | 
			
		||||
            // if current frame fits into one rtp packet, need to hold
 | 
			
		||||
            // that for the next av_get_packet call
 | 
			
		||||
            ret = end_packet ? 1 : 0;
 | 
			
		||||
            uint8_t *tmp;
 | 
			
		||||
            avio_close_dyn_buf(vp8->data, &tmp);
 | 
			
		||||
            av_free(tmp);
 | 
			
		||||
            vp8->data = NULL;
 | 
			
		||||
        }
 | 
			
		||||
        if ((res = avio_open_dyn_buf(&vp8->data)) < 0)
 | 
			
		||||
            return res;
 | 
			
		||||
        vp8->is_keyframe = *buf & 1;
 | 
			
		||||
        vp8->timestamp   = ts;
 | 
			
		||||
        vp8->timestamp = *timestamp;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    if (!vp8->data || vp8->timestamp != *timestamp && ret == AVERROR(EAGAIN)) {
 | 
			
		||||
    if (!vp8->data || vp8->timestamp != *timestamp) {
 | 
			
		||||
        av_log(ctx, AV_LOG_WARNING,
 | 
			
		||||
               "Received no start marker; dropping frame\n");
 | 
			
		||||
        return AVERROR(EAGAIN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // cycle through VP8AU headers if needed
 | 
			
		||||
    // not tested with actual VP8AUs
 | 
			
		||||
    while (len) {
 | 
			
		||||
        int au_len = len;
 | 
			
		||||
        if (has_au && len > 2) {
 | 
			
		||||
            au_len = AV_RB16(buf);
 | 
			
		||||
            buf += 2;
 | 
			
		||||
            len -= 2;
 | 
			
		||||
            if (buf + au_len > buf + len) {
 | 
			
		||||
                av_log(ctx, AV_LOG_ERROR, "Invalid VP8AU length\n");
 | 
			
		||||
                return AVERROR_INVALIDDATA;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        avio_write(vp8->data, buf, au_len);
 | 
			
		||||
        buf += au_len;
 | 
			
		||||
        len -= au_len;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (ret != AVERROR(EAGAIN)) // did we miss a end marker?
 | 
			
		||||
        return ret;
 | 
			
		||||
    avio_write(vp8->data, buf, len);
 | 
			
		||||
 | 
			
		||||
    if (end_packet) {
 | 
			
		||||
        prepare_packet(pkt, vp8, st->index);
 | 
			
		||||
@@ -129,8 +142,6 @@ static int vp8_handle_packet(AVFormatContext *ctx,
 | 
			
		||||
 | 
			
		||||
static PayloadContext *vp8_new_context(void)
 | 
			
		||||
{
 | 
			
		||||
    av_log(NULL, AV_LOG_ERROR, "RTP VP8 payload implementation is incompatible "
 | 
			
		||||
                               "with the latest spec drafts.\n");
 | 
			
		||||
    return av_mallocz(sizeof(PayloadContext));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -77,6 +77,7 @@ static int is_supported(enum AVCodecID id)
 | 
			
		||||
    case AV_CODEC_ID_ILBC:
 | 
			
		||||
    case AV_CODEC_ID_MJPEG:
 | 
			
		||||
    case AV_CODEC_ID_SPEEX:
 | 
			
		||||
    case AV_CODEC_ID_OPUS:
 | 
			
		||||
        return 1;
 | 
			
		||||
    default:
 | 
			
		||||
        return 0;
 | 
			
		||||
@@ -181,15 +182,21 @@ static int rtp_write_header(AVFormatContext *s1)
 | 
			
		||||
        s->max_payload_size -= 6; // ident+frag+tdt/vdt+pkt_num+pkt_length
 | 
			
		||||
        s->num_frames = 0;
 | 
			
		||||
        goto defaultcase;
 | 
			
		||||
    case AV_CODEC_ID_VP8:
 | 
			
		||||
        av_log(s1, AV_LOG_ERROR, "RTP VP8 payload implementation is "
 | 
			
		||||
                                 "incompatible with the latest spec drafts.\n");
 | 
			
		||||
        break;
 | 
			
		||||
    case AV_CODEC_ID_ADPCM_G722:
 | 
			
		||||
        /* Due to a historical error, the clock rate for G722 in RTP is
 | 
			
		||||
         * 8000, even if the sample rate is 16000. See RFC 3551. */
 | 
			
		||||
        avpriv_set_pts_info(st, 32, 1, 8000);
 | 
			
		||||
        break;
 | 
			
		||||
    case AV_CODEC_ID_OPUS:
 | 
			
		||||
        if (st->codec->channels > 2) {
 | 
			
		||||
            av_log(s1, AV_LOG_ERROR, "Multistream opus not supported in RTP\n");
 | 
			
		||||
            goto fail;
 | 
			
		||||
        }
 | 
			
		||||
        /* The opus RTP RFC says that all opus streams should use 48000 Hz
 | 
			
		||||
         * as clock rate, since all opus sample rates can be expressed in
 | 
			
		||||
         * this clock rate, and sample rate changes on the fly are supported. */
 | 
			
		||||
        avpriv_set_pts_info(st, 32, 1, 48000);
 | 
			
		||||
        break;
 | 
			
		||||
    case AV_CODEC_ID_ILBC:
 | 
			
		||||
        if (st->codec->block_align != 38 && st->codec->block_align != 50) {
 | 
			
		||||
            av_log(s1, AV_LOG_ERROR, "Incorrect iLBC block size specified\n");
 | 
			
		||||
@@ -529,6 +536,14 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
 | 
			
		||||
    case AV_CODEC_ID_MJPEG:
 | 
			
		||||
        ff_rtp_send_jpeg(s1, pkt->data, size);
 | 
			
		||||
        break;
 | 
			
		||||
    case AV_CODEC_ID_OPUS:
 | 
			
		||||
        if (size > s->max_payload_size) {
 | 
			
		||||
            av_log(s1, AV_LOG_ERROR,
 | 
			
		||||
                   "Packet size %d too large for max RTP payload size %d\n",
 | 
			
		||||
                   size, s->max_payload_size);
 | 
			
		||||
            return AVERROR(EINVAL);
 | 
			
		||||
        }
 | 
			
		||||
        /* Intentional fallthrough */
 | 
			
		||||
    default:
 | 
			
		||||
        /* better than nothing : send the codec raw data */
 | 
			
		||||
        rtp_send_raw(s1, pkt->data, size);
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@
 | 
			
		||||
#include "rtpenc.h"
 | 
			
		||||
 | 
			
		||||
/* Based on a draft spec for VP8 RTP.
 | 
			
		||||
 * ( http://www.webmproject.org/code/specs/rtp/ ) */
 | 
			
		||||
 * ( http://tools.ietf.org/html/draft-ietf-payload-vp8-05 ) */
 | 
			
		||||
void ff_rtp_send_vp8(AVFormatContext *s1, const uint8_t *buf, int size)
 | 
			
		||||
{
 | 
			
		||||
    RTPMuxContext *s = s1->priv_data;
 | 
			
		||||
@@ -32,7 +32,9 @@ void ff_rtp_send_vp8(AVFormatContext *s1, const uint8_t *buf, int size)
 | 
			
		||||
    s->timestamp    = s->cur_timestamp;
 | 
			
		||||
    max_packet_size = s->max_payload_size - 1; // minus one for header byte
 | 
			
		||||
 | 
			
		||||
    *s->buf_ptr++ = 1; // 0b1 indicates start of frame
 | 
			
		||||
    // no extended control bits, reference frame, start of partition,
 | 
			
		||||
    // partition id 0
 | 
			
		||||
    *s->buf_ptr++ = 0x10;
 | 
			
		||||
    while (size > 0) {
 | 
			
		||||
        len = FFMIN(size, max_packet_size);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -576,6 +576,10 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
 | 
			
		||||
            av_strlcatf(buff, size, "a=rtpmap:%d speex/%d\r\n",
 | 
			
		||||
                                     payload_type, c->sample_rate);
 | 
			
		||||
            break;
 | 
			
		||||
        case AV_CODEC_ID_OPUS:
 | 
			
		||||
            av_strlcatf(buff, size, "a=rtpmap:%d opus/48000\r\n",
 | 
			
		||||
                                     payload_type);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            /* Nothing special to do here... */
 | 
			
		||||
            break;
 | 
			
		||||
 
 | 
			
		||||
@@ -100,6 +100,8 @@ OBJS-$(HAVE_BROKEN_SNPRINTF) += ../compat/msvcrt/snprintf.o
 | 
			
		||||
 | 
			
		||||
OBJS-$(HAVE_MSVCRT) += ../compat/strtod.o
 | 
			
		||||
 | 
			
		||||
SKIPHEADERS          = old_pix_fmts.h
 | 
			
		||||
 | 
			
		||||
TESTPROGS = adler32                                                     \
 | 
			
		||||
            aes                                                         \
 | 
			
		||||
            avstring                                                    \
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user