* qatar/master: bitstream: Properly promote av_reverse values before shifting. libavutil/swscale: YUV444P10/YUV444P9 support. H.264: Fix high bit depth explicit biweight h264: Fix 10-bit H.264 x86 chroma v loopfilter asm. Replace DEBUG_SEEK/DEBUG_SI + av_log combinations by av_dlog. Update copyright year for ac3enc_opts_template.c. adts: Adjust frame size mask to follow the specification. movenc: Add RTP muxer/hinter options movenc: Pass the RTP AVFormatContext to the SDP generation rtspenc: Add RTP muxer options rtspenc: Add an AVClass for setting muxer specific options rtpenc_chain: Pass the rtpflags options through to the chained muxer rtpenc: Declare the rtp flags private AVOptions in rtpenc.h sdp: Reindent after the previous commit rtpenc: MP4A-LATM payload support avoptions: Add an av_opt_flag_is_set function for inspecting flag fields sdp: Allow passing an AVFormatContext to the SDP generation mov: Fix wrong timestamp generation for fragmented movies that have time offset caused by the first edit list entry. mpeg12: more advanced ffmpeg mpeg2 aspect guessing code. swscale: split YUYV output out of yuv2packed[12X]_c(). Conflicts: doc/APIchanges libavcodec/Makefile libavcodec/h264dsp_template.c libavcodec/mpeg12.c libavformat/aacdec.c libavformat/avidec.c libavformat/internal.h libavformat/movenc.c libavformat/rtpenc.c libavformat/rtpenc_latm.c libavformat/sdp.c libavformat/version.h libavutil/avutil.h libavutil/pixfmt.h libswscale/swscale.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.8
| @@ -13,6 +13,9 @@ libavutil: 2011-04-18 | |||
| API changes, most recent first: | |||
| 2011-06-xx - xxxxxxx - lavu 51.6.0 - opt.h | |||
| Add av_opt_flag_is_set(). | |||
| 2011-06-10 - c381960 - lavfi 2.15.0 - avfilter_get_audio_buffer_ref_from_arrays | |||
| Add avfilter_get_audio_buffer_ref_from_arrays() to avfilter.h. | |||
| @@ -558,7 +558,7 @@ OBJS-$(CONFIG_OGG_DEMUXER) += flacdec.o flacdata.o flac.o \ | |||
| dirac.o mpeg12data.o vorbis_data.o | |||
| OBJS-$(CONFIG_OGG_MUXER) += xiph.o flacdec.o flacdata.o flac.o \ | |||
| vorbis_data.o | |||
| OBJS-$(CONFIG_RTP_MUXER) += mpegvideo.o xiph.o | |||
| OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o mpegvideo.o xiph.o | |||
| OBJS-$(CONFIG_SPDIF_DEMUXER) += aacadtsdec.o mpeg4audio.o | |||
| OBJS-$(CONFIG_WEBM_MUXER) += xiph.o mpeg4audio.o \ | |||
| flacdec.o flacdata.o flac.o \ | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * AC-3 encoder options | |||
| * Copyright (c) 2010 Justin Ruggles <justin.ruggles@gmail.com> | |||
| * Copyright (c) 2011 Justin Ruggles <justin.ruggles@gmail.com> | |||
| * | |||
| * This file is part of FFmpeg. | |||
| * | |||
| @@ -118,10 +118,10 @@ static int alloc_table(VLC *vlc, int size, int use_static) | |||
| } | |||
| static av_always_inline uint32_t bitswap_32(uint32_t x) { | |||
| return av_reverse[x&0xFF]<<24 | |||
| | av_reverse[(x>>8)&0xFF]<<16 | |||
| | av_reverse[(x>>16)&0xFF]<<8 | |||
| | av_reverse[x>>24]; | |||
| return (uint32_t)av_reverse[x&0xFF]<<24 | |||
| | (uint32_t)av_reverse[(x>>8)&0xFF]<<16 | |||
| | (uint32_t)av_reverse[(x>>16)&0xFF]<<8 | |||
| | (uint32_t)av_reverse[x>>24]; | |||
| } | |||
| typedef struct { | |||
| @@ -58,11 +58,12 @@ static void FUNCC(weight_h264_pixels ## W ## x ## H)(uint8_t *p_block, int strid | |||
| op_scale1(15); \ | |||
| } \ | |||
| } \ | |||
| static void FUNCC(biweight_h264_pixels ## W ## x ## H)(uint8_t *p_dst, uint8_t *p_src, int stride, int log2_denom, int weightd, int weights, int offset){ \ | |||
| static void FUNCC(biweight_h264_pixels ## W ## x ## H)(uint8_t *_dst, uint8_t *_src, int stride, int log2_denom, int weightd, int weights, int offset){ \ | |||
| int y; \ | |||
| pixel *dst = (pixel*)p_dst; \ | |||
| pixel *src = (pixel*)p_src; \ | |||
| pixel *dst = (pixel*)_dst; \ | |||
| pixel *src = (pixel*)_src; \ | |||
| stride >>= sizeof(pixel)-1; \ | |||
| offset <<= (BIT_DEPTH-8); \ | |||
| offset = ((offset + 1) | 1) << log2_denom; \ | |||
| for(y=0; y<H; y++, dst += stride, src += stride){ \ | |||
| op_scale2(0); \ | |||
| @@ -1331,19 +1331,17 @@ static int mpeg_decode_postinit(AVCodecContext *avctx){ | |||
| avctx->ticks_per_frame=2; | |||
| //MPEG-2 aspect | |||
| if(s->aspect_ratio_info > 1){ | |||
| AVRational dar= | |||
| AVRational dar = | |||
| av_mul_q( | |||
| av_div_q( | |||
| ff_mpeg2_aspect[s->aspect_ratio_info], | |||
| (AVRational){s1->pan_scan.width, s1->pan_scan.height} | |||
| ), | |||
| av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info], | |||
| (AVRational){s1->pan_scan.width, s1->pan_scan.height}), | |||
| (AVRational){s->width, s->height}); | |||
| //we ignore the spec here and guess a bit as reality does not match the spec, see for example | |||
| // we ignore the spec here and guess a bit as reality does not match the spec, see for example | |||
| // res_change_ffmpeg_aspect.ts and sequence-display-aspect.mpg | |||
| //issue1613, 621, 562 | |||
| if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0) | |||
| || (av_cmp_q(dar,(AVRational){4,3})&&av_cmp_q(dar,(AVRational){16,9}))){ | |||
| // issue1613, 621, 562 | |||
| if((s1->pan_scan.width == 0 ) || (s1->pan_scan.height == 0) || | |||
| (av_cmp_q(dar,(AVRational){4,3}) && av_cmp_q(dar,(AVRational){16,9}))) { | |||
| s->avctx->sample_aspect_ratio= | |||
| av_div_q( | |||
| ff_mpeg2_aspect[s->aspect_ratio_info], | |||
| @@ -836,6 +836,13 @@ DEBLOCK_LUMA_INTRA avx | |||
| mova [r0+2*r1], m2 | |||
| %endmacro | |||
| %macro CHROMA_V_LOAD_TC 2 | |||
| movd %1, [%2] | |||
| punpcklbw %1, %1 | |||
| punpcklwd %1, %1 | |||
| psraw %1, 6 | |||
| %endmacro | |||
| %macro DEBLOCK_CHROMA 1 | |||
| ;----------------------------------------------------------------------------- | |||
| ; void deblock_v_chroma( uint16_t *pix, int stride, int alpha, int beta, int8_t *tc0 ) | |||
| @@ -854,7 +861,7 @@ cglobal deblock_v_chroma_10_%1, 5,7-(mmsize/16),8*(mmsize/16) | |||
| LOAD_AB m4, m5, r2d, r3d | |||
| LOAD_MASK m0, m1, m2, m3, m4, m5, m7, m6, m4 | |||
| pxor m4, m4 | |||
| LOAD_TC m6, r4 | |||
| CHROMA_V_LOAD_TC m6, r4 | |||
| psubw m6, [pw_3] | |||
| pmaxsw m6, m4 | |||
| pand m7, m6 | |||
| @@ -44,7 +44,7 @@ static int adts_aac_probe(AVProbeData *p) | |||
| uint32_t header = AV_RB16(buf2); | |||
| if((header&0xFFF6) != 0xFFF0) | |||
| break; | |||
| fsize = (AV_RB32(buf2+3)>>13) & 0x1FFF; | |||
| fsize = (AV_RB32(buf2 + 3) >> 13) & 0x1FFF; | |||
| if(fsize < 7) | |||
| break; | |||
| buf2 += fsize; | |||
| @@ -19,9 +19,6 @@ | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| //#define DEBUG | |||
| //#define DEBUG_SEEK | |||
| #include <strings.h> | |||
| #include "libavutil/intreadwrite.h" | |||
| #include "libavutil/bswap.h" | |||
| @@ -160,10 +157,8 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){ | |||
| int64_t last_pos= -1; | |||
| int64_t filesize= avio_size(s->pb); | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_ERROR, "longs_pre_entry:%d index_type:%d entries_in_use:%d chunk_id:%X base:%16"PRIX64"\n", | |||
| longs_pre_entry,index_type, entries_in_use, chunk_id, base); | |||
| #endif | |||
| av_dlog(s, "longs_pre_entry:%d index_type:%d entries_in_use:%d chunk_id:%X base:%16"PRIX64"\n", | |||
| longs_pre_entry,index_type, entries_in_use, chunk_id, base); | |||
| if(stream_id >= s->nb_streams || stream_id < 0) | |||
| return -1; | |||
| @@ -1182,10 +1177,8 @@ static int avi_read_idx1(AVFormatContext *s, int size) | |||
| flags = avio_rl32(pb); | |||
| pos = avio_rl32(pb); | |||
| len = avio_rl32(pb); | |||
| #if defined(DEBUG_SEEK) | |||
| av_log(s, AV_LOG_DEBUG, "%d: tag=0x%x flags=0x%x pos=0x%x len=%d/", | |||
| i, tag, flags, pos, len); | |||
| #endif | |||
| av_dlog(s, "%d: tag=0x%x flags=0x%x pos=0x%x len=%d/", | |||
| i, tag, flags, pos, len); | |||
| if(i==0 && pos > avi->movi_list) | |||
| avi->movi_list= 0; //FIXME better check | |||
| pos += avi->movi_list; | |||
| @@ -1254,22 +1247,18 @@ static int avi_load_index(AVFormatContext *s) | |||
| if (avio_seek(pb, avi->movi_end, SEEK_SET) < 0) | |||
| goto the_end; // maybe truncated file | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "movi_end=0x%"PRIx64"\n", avi->movi_end); | |||
| #endif | |||
| av_dlog(s, "movi_end=0x%"PRIx64"\n", avi->movi_end); | |||
| for(;;) { | |||
| if (url_feof(pb)) | |||
| break; | |||
| tag = avio_rl32(pb); | |||
| size = avio_rl32(pb); | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "tag=%c%c%c%c size=0x%x\n", | |||
| tag & 0xff, | |||
| (tag >> 8) & 0xff, | |||
| (tag >> 16) & 0xff, | |||
| (tag >> 24) & 0xff, | |||
| size); | |||
| #endif | |||
| av_dlog(s, "tag=%c%c%c%c size=0x%x\n", | |||
| tag & 0xff, | |||
| (tag >> 8) & 0xff, | |||
| (tag >> 16) & 0xff, | |||
| (tag >> 24) & 0xff, | |||
| size); | |||
| switch(tag) { | |||
| case MKTAG('i', 'd', 'x', '1'): | |||
| if (avi_read_idx1(s, size) < 0) | |||
| @@ -163,8 +163,6 @@ static int ffm_read_data(AVFormatContext *s, | |||
| return size1 - size; | |||
| } | |||
| //#define DEBUG_SEEK | |||
| /* ensure that acutal seeking happens between FFM_PACKET_SIZE | |||
| and file_size - FFM_PACKET_SIZE */ | |||
| static void ffm_seek1(AVFormatContext *s, int64_t pos1) | |||
| @@ -175,9 +173,7 @@ static void ffm_seek1(AVFormatContext *s, int64_t pos1) | |||
| pos = FFMIN(pos1, ffm->file_size - FFM_PACKET_SIZE); | |||
| pos = FFMAX(pos, FFM_PACKET_SIZE); | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "seek to %"PRIx64" -> %"PRIx64"\n", pos1, pos); | |||
| #endif | |||
| av_dlog(s, "seek to %"PRIx64" -> %"PRIx64"\n", pos1, pos); | |||
| avio_seek(pb, pos, SEEK_SET); | |||
| } | |||
| @@ -189,9 +185,7 @@ static int64_t get_dts(AVFormatContext *s, int64_t pos) | |||
| ffm_seek1(s, pos); | |||
| avio_skip(pb, 4); | |||
| dts = avio_rb64(pb); | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "dts=%0.6f\n", dts / 1000000.0); | |||
| #endif | |||
| av_dlog(s, "dts=%0.6f\n", dts / 1000000.0); | |||
| return dts; | |||
| } | |||
| @@ -464,9 +458,7 @@ static int ffm_seek(AVFormatContext *s, int stream_index, int64_t wanted_pts, in | |||
| int64_t pts_min, pts_max, pts; | |||
| double pos1; | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "wanted_pts=%0.6f\n", wanted_pts / 1000000.0); | |||
| #endif | |||
| av_dlog(s, "wanted_pts=%0.6f\n", wanted_pts / 1000000.0); | |||
| /* find the position using linear interpolation (better than | |||
| dichotomy in typical cases) */ | |||
| pos_min = FFM_PACKET_SIZE; | |||
| @@ -122,11 +122,12 @@ int ff_url_join(char *str, int size, const char *proto, | |||
| * @param dest_type the destination address type, may be NULL | |||
| * @param port the destination port of the media stream, 0 if unknown | |||
| * @param ttl the time to live of the stream, 0 if not multicast | |||
| * @param flags the AVFormatContext->flags, modifying the generated SDP | |||
| * @param fmt the AVFormatContext, which might contain options modifying | |||
| * the generated SDP | |||
| */ | |||
| void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, | |||
| const char *dest_addr, const char *dest_type, | |||
| int port, int ttl, int flags); | |||
| int port, int ttl, AVFormatContext *fmt); | |||
| /** | |||
| * Write a packet to another muxer than the one the user originally | |||
| @@ -1537,8 +1537,9 @@ static void mov_build_index(MOVContext *mov, AVStream *st) | |||
| /* adjust first dts according to edit list */ | |||
| if (sc->time_offset && mov->time_scale > 0) { | |||
| int rescaled = sc->time_offset < 0 ? av_rescale(sc->time_offset, sc->time_scale, mov->time_scale) : sc->time_offset; | |||
| current_dts = -rescaled; | |||
| if (sc->time_offset < 0) | |||
| sc->time_offset = av_rescale(sc->time_offset, sc->time_scale, mov->time_scale); | |||
| current_dts = -sc->time_offset; | |||
| if (sc->ctts_data && sc->stts_data && | |||
| sc->ctts_data[0].duration / FFMAX(sc->stts_data[0].duration, 1) > 16) { | |||
| /* more than 16 frames delay, dts are likely wrong | |||
| @@ -2072,7 +2073,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| if (flags & 0x001) data_offset = avio_rb32(pb); | |||
| if (flags & 0x004) first_sample_flags = avio_rb32(pb); | |||
| dts = st->duration; | |||
| dts = st->duration - sc->time_offset; | |||
| offset = frag->base_data_offset + data_offset; | |||
| distance = 0; | |||
| av_dlog(c->fc, "first sample flags 0x%x\n", first_sample_flags); | |||
| @@ -2101,7 +2102,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| offset += sample_size; | |||
| } | |||
| frag->moof_offset = offset; | |||
| st->duration = dts; | |||
| st->duration = dts + sc->time_offset; | |||
| return 0; | |||
| } | |||
| @@ -34,6 +34,7 @@ | |||
| #include "libavutil/avstring.h" | |||
| #include "libavutil/opt.h" | |||
| #include "libavutil/dict.h" | |||
| #include "rtpenc.h" | |||
| #undef NDEBUG | |||
| #include <assert.h> | |||
| @@ -41,6 +42,7 @@ | |||
| static const AVOption options[] = { | |||
| { "movflags", "MOV muxer flags", offsetof(MOVMuxContext, flags), FF_OPT_TYPE_FLAGS, {.dbl = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" }, | |||
| { "rtphint", "Add RTP hint tracks", 0, FF_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_RTP_HINT}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" }, | |||
| FF_RTP_FLAG_OPTS(MOVMuxContext, rtp_flags), | |||
| { NULL }, | |||
| }; | |||
| @@ -1368,7 +1370,7 @@ static int mov_write_udta_sdp(AVIOContext *pb, AVFormatContext *ctx, int index) | |||
| char buf[1000] = ""; | |||
| int len; | |||
| ff_sdp_write_media(buf, sizeof(buf), ctx->streams[0]->codec, NULL, NULL, 0, 0, ctx->flags); | |||
| ff_sdp_write_media(buf, sizeof(buf), ctx->streams[0]->codec, NULL, NULL, 0, 0, ctx); | |||
| av_strlcatf(buf, sizeof(buf), "a=control:streamid=%d\r\n", index); | |||
| len = strlen(buf); | |||
| @@ -111,6 +111,7 @@ typedef struct MOVMuxContext { | |||
| MOVTrack *tracks; | |||
| int flags; | |||
| int rtp_flags; | |||
| } MOVMuxContext; | |||
| #define FF_MOV_FLAG_RTP_HINT 1 | |||
| @@ -23,8 +23,6 @@ | |||
| #include "internal.h" | |||
| #include "mpeg.h" | |||
| //#define DEBUG_SEEK | |||
| #undef NDEBUG | |||
| #include <assert.h> | |||
| @@ -592,9 +590,7 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, | |||
| for(;;) { | |||
| len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); | |||
| if (len < 0) { | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "none (ret=%d)\n", len); | |||
| #endif | |||
| av_dlog(s, "none (ret=%d)\n", len); | |||
| return AV_NOPTS_VALUE; | |||
| } | |||
| if (startcode == s->streams[stream_index]->id && | |||
| @@ -603,10 +599,8 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, | |||
| } | |||
| avio_skip(s->pb, len); | |||
| } | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n", | |||
| pos, dts, dts / 90000.0); | |||
| #endif | |||
| av_dlog(s, "pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n", | |||
| pos, dts, dts / 90000.0); | |||
| *ppos = pos; | |||
| return dts; | |||
| } | |||
| @@ -25,7 +25,6 @@ | |||
| #include "mpeg.h" | |||
| #define MAX_PAYLOAD_SIZE 4096 | |||
| //#define DEBUG_SEEK | |||
| #undef NDEBUG | |||
| #include <assert.h> | |||
| @@ -19,8 +19,6 @@ | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| //#define DEBUG | |||
| //#define DEBUG_SEEK | |||
| //#define USE_SYNCPOINT_SEARCH | |||
| #include "libavutil/crc.h" | |||
| @@ -22,9 +22,7 @@ | |||
| #include "riff.h" | |||
| #include "libavutil/dict.h" | |||
| //#define DEBUG | |||
| //#define DEBUG_DUMP_INDEX // XXX dumbdriving-271.nsv breaks with it commented!! | |||
| //#define DEBUG_SEEK | |||
| #define CHECK_SUBSEQUENT_NSVS | |||
| //#define DISABLE_AUDIO | |||
| @@ -23,11 +23,24 @@ | |||
| #include "mpegts.h" | |||
| #include "internal.h" | |||
| #include "libavutil/random_seed.h" | |||
| #include "libavutil/opt.h" | |||
| #include "rtpenc.h" | |||
| //#define DEBUG | |||
| static const AVOption options[] = { | |||
| FF_RTP_FLAG_OPTS(RTPMuxContext, flags), | |||
| { NULL }, | |||
| }; | |||
| static const AVClass rtp_muxer_class = { | |||
| .class_name = "RTP muxer", | |||
| .item_name = av_default_item_name, | |||
| .option = options, | |||
| .version = LIBAVUTIL_VERSION_INT, | |||
| }; | |||
| #define RTCP_SR_SIZE 28 | |||
| static int is_supported(enum CodecID id) | |||
| @@ -404,7 +417,7 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) | |||
| ff_rtp_send_mpegvideo(s1, pkt->data, size); | |||
| break; | |||
| case CODEC_ID_AAC: | |||
| if (s1->flags & AVFMT_FLAG_MP4A_LATM) | |||
| if (s->flags & FF_RTP_FLAG_MP4A_LATM) | |||
| ff_rtp_send_latm(s1, pkt->data, size); | |||
| else | |||
| ff_rtp_send_aac(s1, pkt->data, size); | |||
| @@ -458,4 +471,5 @@ AVOutputFormat ff_rtp_muxer = { | |||
| rtp_write_header, | |||
| rtp_write_packet, | |||
| rtp_write_trailer, | |||
| .priv_class = &rtp_muxer_class, | |||
| }; | |||
| @@ -25,6 +25,7 @@ | |||
| #include "rtp.h" | |||
| struct RTPMuxContext { | |||
| const AVClass *av_class; | |||
| AVFormatContext *ic; | |||
| AVStream *st; | |||
| int payload_type; | |||
| @@ -56,10 +57,18 @@ struct RTPMuxContext { | |||
| * (1, 2 or 4) | |||
| */ | |||
| int nal_length_size; | |||
| int flags; | |||
| }; | |||
| typedef struct RTPMuxContext RTPMuxContext; | |||
| #define FF_RTP_FLAG_MP4A_LATM 1 | |||
| #define FF_RTP_FLAG_OPTS(ctx, fieldname) \ | |||
| { "rtpflags", "RTP muxer flags", offsetof(ctx, fieldname), FF_OPT_TYPE_FLAGS, {.dbl = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "rtpflags" }, \ | |||
| { "latm", "Use MP4A-LATM packetization instead of MPEG4-GENERIC for AAC", 0, FF_OPT_TYPE_CONST, {.dbl = FF_RTP_FLAG_MP4A_LATM}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "rtpflags" } \ | |||
| void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m); | |||
| void ff_rtp_send_h264(AVFormatContext *s1, const uint8_t *buf1, int size); | |||
| @@ -23,6 +23,7 @@ | |||
| #include "avio_internal.h" | |||
| #include "rtpenc_chain.h" | |||
| #include "avio_internal.h" | |||
| #include "libavutil/opt.h" | |||
| AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st, | |||
| URLContext *handle, int packet_size) | |||
| @@ -50,6 +51,13 @@ AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st, | |||
| rtpctx->streams[0]->sample_aspect_ratio = st->sample_aspect_ratio; | |||
| rtpctx->flags |= s->flags & AVFMT_FLAG_MP4A_LATM; | |||
| av_set_parameters(rtpctx, NULL); | |||
| /* Copy the rtpflags values straight through */ | |||
| if (s->oformat->priv_class && | |||
| av_find_opt(s->priv_data, "rtpflags", NULL, 0, 0)) | |||
| av_set_int(rtpctx->priv_data, "rtpflags", | |||
| av_get_int(s->priv_data, "rtpflags", NULL)); | |||
| /* Set the synchronized start time. */ | |||
| rtpctx->start_time_realtime = s->start_time_realtime; | |||
| @@ -22,7 +22,8 @@ | |||
| #include "avformat.h" | |||
| #include "rtpenc.h" | |||
| void ff_rtp_send_latm(AVFormatContext *s1, const uint8_t *buff, int size) { | |||
| void ff_rtp_send_latm(AVFormatContext *s1, const uint8_t *buff, int size) | |||
| { | |||
| /* MP4A-LATM | |||
| * The RTP payload format specification is described in RFC 3016 | |||
| * The encoding specifications are provided in ISO/IEC 14496-3 */ | |||
| @@ -344,6 +344,11 @@ typedef struct RTSPState { | |||
| * Do not begin to play the stream immediately. | |||
| */ | |||
| int initial_pause; | |||
| /** | |||
| * Option flags for the chained RTP muxer. | |||
| */ | |||
| int rtp_muxer_flags; | |||
| } RTSPState; | |||
| /** | |||
| @@ -33,9 +33,23 @@ | |||
| #include "libavutil/intreadwrite.h" | |||
| #include "libavutil/avstring.h" | |||
| #include "url.h" | |||
| #include "libavutil/opt.h" | |||
| #include "rtpenc.h" | |||
| #define SDP_MAX_SIZE 16384 | |||
| static const AVOption options[] = { | |||
| FF_RTP_FLAG_OPTS(RTSPState, rtp_muxer_flags), | |||
| { NULL }, | |||
| }; | |||
| static const AVClass rtsp_muxer_class = { | |||
| .class_name = "RTSP muxer", | |||
| .item_name = av_default_item_name, | |||
| .option = options, | |||
| .version = LIBAVUTIL_VERSION_INT, | |||
| }; | |||
| int ff_rtsp_setup_output_streams(AVFormatContext *s, const char *addr) | |||
| { | |||
| RTSPState *rt = s->priv_data; | |||
| @@ -238,5 +252,6 @@ AVOutputFormat ff_rtsp_muxer = { | |||
| rtsp_write_packet, | |||
| rtsp_write_close, | |||
| .flags = AVFMT_NOFILE | AVFMT_GLOBALHEADER, | |||
| .priv_class = &rtsp_muxer_class, | |||
| }; | |||
| @@ -23,6 +23,7 @@ | |||
| #include "libavutil/base64.h" | |||
| #include "libavutil/dict.h" | |||
| #include "libavutil/parseutils.h" | |||
| #include "libavutil/opt.h" | |||
| #include "libavcodec/xiph.h" | |||
| #include "libavcodec/mpeg4audio.h" | |||
| #include "avformat.h" | |||
| @@ -301,7 +302,8 @@ xiph_fail: | |||
| return NULL; | |||
| } | |||
| static int latm_context2profilelevel(AVCodecContext *c) { | |||
| static int latm_context2profilelevel(AVCodecContext *c) | |||
| { | |||
| /* MP4A-LATM | |||
| * The RTP payload format specification is described in RFC 3016 | |||
| * The encoding specifications are provided in ISO/IEC 14496-3 */ | |||
| @@ -329,7 +331,8 @@ static int latm_context2profilelevel(AVCodecContext *c) { | |||
| return profile_level; | |||
| } | |||
| static char *latm_context2config(AVCodecContext *c) { | |||
| static char *latm_context2config(AVCodecContext *c) | |||
| { | |||
| /* MP4A-LATM | |||
| * The RTP payload format specification is described in RFC 3016 | |||
| * The encoding specifications are provided in ISO/IEC 14496-3 */ | |||
| @@ -364,7 +367,7 @@ static char *latm_context2config(AVCodecContext *c) { | |||
| return config; | |||
| } | |||
| static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, int payload_type, int flags) | |||
| static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, int payload_type, AVFormatContext *fmt) | |||
| { | |||
| char *config = NULL; | |||
| @@ -399,7 +402,8 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, | |||
| payload_type, config ? config : ""); | |||
| break; | |||
| case CODEC_ID_AAC: | |||
| if (flags & AVFMT_FLAG_MP4A_LATM) { | |||
| if (fmt && fmt->oformat->priv_class && | |||
| av_opt_flag_is_set(fmt->priv_data, "rtpflags", "latm")) { | |||
| config = latm_context2config(c); | |||
| if (!config) | |||
| return NULL; | |||
| @@ -523,7 +527,7 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, | |||
| return buff; | |||
| } | |||
| void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, const char *dest_type, int port, int ttl, int flags) | |||
| void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, const char *dest_type, int port, int ttl, AVFormatContext *fmt) | |||
| { | |||
| const char *type; | |||
| int payload_type; | |||
| @@ -546,7 +550,7 @@ void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *des | |||
| av_strlcatf(buff, size, "b=AS:%d\r\n", c->bit_rate / 1000); | |||
| } | |||
| sdp_write_media_attributes(buff, size, c, payload_type, flags); | |||
| sdp_write_media_attributes(buff, size, c, payload_type, fmt); | |||
| } | |||
| int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size) | |||
| @@ -596,7 +600,7 @@ int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size) | |||
| ff_sdp_write_media(buf, size, | |||
| ac[i]->streams[j]->codec, dst[0] ? dst : NULL, | |||
| dst_type, (port > 0) ? port + j * 2 : 0, ttl, | |||
| ac[i]->flags); | |||
| ac[i]); | |||
| if (port <= 0) { | |||
| av_strlcatf(buf, size, | |||
| "a=control:streamid=%d\r\n", i + j); | |||
| @@ -612,7 +616,7 @@ int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size) | |||
| return AVERROR(ENOSYS); | |||
| } | |||
| void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, const char *dest_type, int port, int ttl, int flags) | |||
| void ff_sdp_write_media(char *buff, int size, AVCodecContext *c, const char *dest_addr, const char *dest_type, int port, int ttl, AVFormatContext *fmt) | |||
| { | |||
| } | |||
| #endif | |||
| @@ -1449,8 +1449,6 @@ int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, | |||
| wanted_timestamp, flags); | |||
| } | |||
| #define DEBUG_SEEK | |||
| int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){ | |||
| AVInputFormat *avif= s->iformat; | |||
| int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit; | |||
| @@ -1462,9 +1460,7 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts | |||
| if (stream_index < 0) | |||
| return -1; | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts); | |||
| #endif | |||
| av_dlog(s, "read_seek: %d %"PRId64"\n", stream_index, target_ts); | |||
| ts_max= | |||
| ts_min= AV_NOPTS_VALUE; | |||
| @@ -1481,10 +1477,8 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts | |||
| if(e->timestamp <= target_ts || e->pos == e->min_distance){ | |||
| pos_min= e->pos; | |||
| ts_min= e->timestamp; | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n", | |||
| pos_min,ts_min); | |||
| #endif | |||
| av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n", | |||
| pos_min,ts_min); | |||
| }else{ | |||
| assert(index==0); | |||
| } | |||
| @@ -1497,10 +1491,8 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts | |||
| pos_max= e->pos; | |||
| ts_max= e->timestamp; | |||
| pos_limit= pos_max - e->min_distance; | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n", | |||
| pos_max,pos_limit, ts_max); | |||
| #endif | |||
| av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n", | |||
| pos_max,pos_limit, ts_max); | |||
| } | |||
| } | |||
| @@ -1522,9 +1514,7 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, i | |||
| int64_t start_pos, filesize; | |||
| int no_change; | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts); | |||
| #endif | |||
| av_dlog(s, "gen_seek: %d %"PRId64"\n", stream_index, target_ts); | |||
| if(ts_min == AV_NOPTS_VALUE){ | |||
| pos_min = s->data_offset; | |||
| @@ -1566,11 +1556,8 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, i | |||
| no_change=0; | |||
| while (pos_min < pos_limit) { | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n", | |||
| pos_min, pos_max, | |||
| ts_min, ts_max); | |||
| #endif | |||
| av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n", | |||
| pos_min, pos_max, ts_min, ts_max); | |||
| assert(pos_limit <= pos_max); | |||
| if(no_change==0){ | |||
| @@ -1597,11 +1584,9 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, i | |||
| no_change++; | |||
| else | |||
| no_change=0; | |||
| #ifdef DEBUG_SEEK | |||
| av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n", | |||
| pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit, | |||
| start_pos, no_change); | |||
| #endif | |||
| av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n", | |||
| pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, | |||
| pos_limit, start_pos, no_change); | |||
| if(ts == AV_NOPTS_VALUE){ | |||
| av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n"); | |||
| return -1; | |||
| @@ -1620,13 +1605,13 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, i | |||
| pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max; | |||
| ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max; | |||
| #ifdef DEBUG_SEEK | |||
| #if 1 | |||
| pos_min = pos; | |||
| ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX); | |||
| pos_min++; | |||
| ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX); | |||
| av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n", | |||
| pos, ts_min, target_ts, ts_max); | |||
| av_dlog(s, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n", | |||
| pos, ts_min, target_ts, ts_max); | |||
| #endif | |||
| *ts_ret= ts; | |||
| return pos; | |||
| @@ -2694,9 +2679,7 @@ AVProgram *av_new_program(AVFormatContext *ac, int id) | |||
| AVProgram *program=NULL; | |||
| int i; | |||
| #ifdef DEBUG_SI | |||
| av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id); | |||
| #endif | |||
| av_dlog(ac, "new_program: id=0x%04x\n", id); | |||
| for(i=0; i<ac->nb_programs; i++) | |||
| if(ac->programs[i]->id == id) | |||
| @@ -25,7 +25,7 @@ | |||
| #define LIBAVFORMAT_VERSION_MAJOR 53 | |||
| #define LIBAVFORMAT_VERSION_MINOR 3 | |||
| #define LIBAVFORMAT_VERSION_MICRO 0 | |||
| #define LIBAVFORMAT_VERSION_MICRO 1 | |||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | |||
| LIBAVFORMAT_VERSION_MINOR, \ | |||
| @@ -320,6 +320,16 @@ int64_t av_get_int(void *obj, const char *name, const AVOption **o_out) | |||
| return num*intnum/den; | |||
| } | |||
| int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name) | |||
| { | |||
| const AVOption *field = av_find_opt(obj, field_name, NULL, 0, 0); | |||
| const AVOption *flag = av_find_opt(obj, flag_name, NULL, 0, 0); | |||
| if (!field || !flag || flag->type != FF_OPT_TYPE_CONST) | |||
| return 0; | |||
| return av_get_int(obj, field_name, NULL) & (int) flag->default_val.dbl; | |||
| } | |||
| static void opt_list(void *obj, void *av_log_obj, const char *unit, | |||
| int req_flags, int rej_flags) | |||
| { | |||
| @@ -181,4 +181,14 @@ int av_set_options_string(void *ctx, const char *opts, | |||
| */ | |||
| void av_opt_free(void *obj); | |||
| /** | |||
| * Check whether a particular flag is set in a flags field. | |||
| * | |||
| * @param field_name the name of the flag field option | |||
| * @param flag_name the name of the flag to check | |||
| * @return non-zero if the flag is set, zero if the flag isn't set, | |||
| * isn't of the right type, or the flags field doesn't exist. | |||
| */ | |||
| int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name); | |||
| #endif /* AVUTIL_OPT_H */ | |||
| @@ -878,6 +878,52 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = { | |||
| }, | |||
| .flags = PIX_FMT_BE, | |||
| }, | |||
| [PIX_FMT_YUV444P10LE] = { | |||
| .name = "yuv444p10le", | |||
| .nb_components= 3, | |||
| .log2_chroma_w= 0, | |||
| .log2_chroma_h= 0, | |||
| .comp = { | |||
| {0,1,1,0,9}, /* Y */ | |||
| {1,1,1,0,9}, /* U */ | |||
| {2,1,1,0,9}, /* V */ | |||
| }, | |||
| }, | |||
| [PIX_FMT_YUV444P10BE] = { | |||
| .name = "yuv444p10be", | |||
| .nb_components= 3, | |||
| .log2_chroma_w= 0, | |||
| .log2_chroma_h= 0, | |||
| .comp = { | |||
| {0,1,1,0,9}, /* Y */ | |||
| {1,1,1,0,9}, /* U */ | |||
| {2,1,1,0,9}, /* V */ | |||
| }, | |||
| .flags = PIX_FMT_BE, | |||
| }, | |||
| [PIX_FMT_YUV444P9LE] = { | |||
| .name = "yuv444p9le", | |||
| .nb_components= 3, | |||
| .log2_chroma_w= 0, | |||
| .log2_chroma_h= 0, | |||
| .comp = { | |||
| {0,1,1,0,8}, /* Y */ | |||
| {1,1,1,0,8}, /* U */ | |||
| {2,1,1,0,8}, /* V */ | |||
| }, | |||
| }, | |||
| [PIX_FMT_YUV444P9BE] = { | |||
| .name = "yuv444p9be", | |||
| .nb_components= 3, | |||
| .log2_chroma_w= 0, | |||
| .log2_chroma_h= 0, | |||
| .comp = { | |||
| {0,1,1,0,9}, /* Y */ | |||
| {1,1,1,0,9}, /* U */ | |||
| {2,1,1,0,9}, /* V */ | |||
| }, | |||
| .flags = PIX_FMT_BE, | |||
| }, | |||
| [PIX_FMT_DXVA2_VLD] = { | |||
| .name = "dxva2_vld", | |||
| .log2_chroma_w = 1, | |||
| @@ -136,15 +136,19 @@ enum PixelFormat { | |||
| PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian | |||
| PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian | |||
| //the following 6 formats have the disadvantage of needing 1 format for each bit depth, thus | |||
| //the following 10 formats have the disadvantage of needing 1 format for each bit depth, thus | |||
| //If you want to support multiple bit depths, then using PIX_FMT_YUV420P16* with the bpp stored seperately | |||
| //is better | |||
| PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian | |||
| PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian | |||
| PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian | |||
| PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian | |||
| PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian | |||
| PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian | |||
| PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian | |||
| PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian | |||
| PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian | |||
| PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian | |||
| PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian | |||
| PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian | |||
| PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions | |||
| }; | |||
| @@ -173,8 +177,10 @@ enum PixelFormat { | |||
| #define PIX_FMT_BGR444 PIX_FMT_NE(BGR444BE, BGR444LE) | |||
| #define PIX_FMT_YUV420P9 PIX_FMT_NE(YUV420P9BE , YUV420P9LE) | |||
| #define PIX_FMT_YUV444P9 PIX_FMT_NE(YUV444P9BE , YUV444P9LE) | |||
| #define PIX_FMT_YUV420P10 PIX_FMT_NE(YUV420P10BE, YUV420P10LE) | |||
| #define PIX_FMT_YUV422P10 PIX_FMT_NE(YUV422P10BE, YUV422P10LE) | |||
| #define PIX_FMT_YUV444P10 PIX_FMT_NE(YUV444P10BE, YUV444P10LE) | |||
| #define PIX_FMT_YUV420P16 PIX_FMT_NE(YUV420P16BE, YUV420P16LE) | |||
| #define PIX_FMT_YUV422P16 PIX_FMT_NE(YUV422P16BE, YUV422P16LE) | |||
| #define PIX_FMT_YUV444P16 PIX_FMT_NE(YUV444P16BE, YUV444P16LE) | |||
| @@ -724,7 +724,117 @@ yuv2mono_1_c_template(SwsContext *c, const uint16_t *buf0, | |||
| YUV2PACKEDWRAPPER(yuv2mono, white, PIX_FMT_MONOWHITE); | |||
| YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK); | |||
| #define YSCALE_YUV_2_PACKEDX_C(type,alpha) \ | |||
| static av_always_inline void | |||
| yuv2422_X_c_template(SwsContext *c, const int16_t *lumFilter, | |||
| const int16_t **lumSrc, int lumFilterSize, | |||
| const int16_t *chrFilter, const int16_t **chrUSrc, | |||
| const int16_t **chrVSrc, int chrFilterSize, | |||
| const int16_t **alpSrc, uint8_t *dest, int dstW, | |||
| int y, enum PixelFormat target) | |||
| { | |||
| int i; | |||
| #define output_pixels(pos, Y1, U, Y2, V) \ | |||
| if (target == PIX_FMT_YUYV422) { \ | |||
| dest[pos + 0] = Y1; \ | |||
| dest[pos + 1] = U; \ | |||
| dest[pos + 2] = Y2; \ | |||
| dest[pos + 3] = V; \ | |||
| } else { \ | |||
| dest[pos + 0] = U; \ | |||
| dest[pos + 1] = Y1; \ | |||
| dest[pos + 2] = V; \ | |||
| dest[pos + 3] = Y2; \ | |||
| } | |||
| for (i = 0; i < (dstW >> 1); i++) { | |||
| int j; | |||
| int Y1 = 1 << 18; | |||
| int Y2 = 1 << 18; | |||
| int U = 1 << 18; | |||
| int V = 1 << 18; | |||
| for (j = 0; j < lumFilterSize; j++) { | |||
| Y1 += lumSrc[j][i * 2] * lumFilter[j]; | |||
| Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j]; | |||
| } | |||
| for (j = 0; j < chrFilterSize; j++) { | |||
| U += chrUSrc[j][i] * chrFilter[j]; | |||
| V += chrVSrc[j][i] * chrFilter[j]; | |||
| } | |||
| Y1 >>= 19; | |||
| Y2 >>= 19; | |||
| U >>= 19; | |||
| V >>= 19; | |||
| if ((Y1 | Y2 | U | V) & 0x100) { | |||
| Y1 = av_clip_uint8(Y1); | |||
| Y2 = av_clip_uint8(Y2); | |||
| U = av_clip_uint8(U); | |||
| V = av_clip_uint8(V); | |||
| } | |||
| output_pixels(4*i, Y1, U, Y2, V); | |||
| } | |||
| } | |||
| static av_always_inline void | |||
| yuv2422_2_c_template(SwsContext *c, const uint16_t *buf0, | |||
| const uint16_t *buf1, const uint16_t *ubuf0, | |||
| const uint16_t *ubuf1, const uint16_t *vbuf0, | |||
| const uint16_t *vbuf1, const uint16_t *abuf0, | |||
| const uint16_t *abuf1, uint8_t *dest, int dstW, | |||
| int yalpha, int uvalpha, int y, | |||
| enum PixelFormat target) | |||
| { | |||
| int yalpha1 = 4095 - yalpha; | |||
| int uvalpha1 = 4095 - uvalpha; | |||
| int i; | |||
| for (i = 0; i < (dstW >> 1); i++) { | |||
| int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19; | |||
| int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19; | |||
| int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19; | |||
| int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19; | |||
| output_pixels(i * 4, Y1, U, Y2, V); | |||
| } | |||
| } | |||
| static av_always_inline void | |||
| yuv2422_1_c_template(SwsContext *c, const uint16_t *buf0, | |||
| const uint16_t *ubuf0, const uint16_t *ubuf1, | |||
| const uint16_t *vbuf0, const uint16_t *vbuf1, | |||
| const uint16_t *abuf0, uint8_t *dest, int dstW, | |||
| int uvalpha, enum PixelFormat dstFormat, | |||
| int flags, int y, enum PixelFormat target) | |||
| { | |||
| int i; | |||
| if (uvalpha < 2048) { | |||
| for (i = 0; i < (dstW >> 1); i++) { | |||
| int Y1 = buf0[i * 2] >> 7; | |||
| int Y2 = buf0[i * 2 + 1] >> 7; | |||
| int U = ubuf1[i] >> 7; | |||
| int V = vbuf1[i] >> 7; | |||
| output_pixels(i * 4, Y1, U, Y2, V); | |||
| } | |||
| } else { | |||
| for (i = 0; i < (dstW >> 1); i++) { | |||
| int Y1 = buf0[i * 2] >> 7; | |||
| int Y2 = buf0[i * 2 + 1] >> 7; | |||
| int U = (ubuf0[i] + ubuf1[i]) >> 8; | |||
| int V = (vbuf0[i] + vbuf1[i]) >> 8; | |||
| output_pixels(i * 4, Y1, U, Y2, V); | |||
| } | |||
| } | |||
| #undef output_pixels | |||
| } | |||
| YUV2PACKEDWRAPPER(yuv2422, yuyv, PIX_FMT_YUYV422); | |||
| YUV2PACKEDWRAPPER(yuv2422, uyvy, PIX_FMT_UYVY422); | |||
| #define YSCALE_YUV_2_RGBX_C(type,alpha) \ | |||
| for (i=0; i<(dstW>>1); i++) {\ | |||
| int j;\ | |||
| int Y1 = 1<<18;\ | |||
| @@ -766,7 +876,11 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK); | |||
| A1 = av_clip_uint8(A1); \ | |||
| A2 = av_clip_uint8(A2); \ | |||
| }\ | |||
| } | |||
| }\ | |||
| /* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/\ | |||
| r = (type *)c->table_rV[V]; \ | |||
| g = (type *)(c->table_gU[U] + c->table_gV[V]); \ | |||
| b = (type *)c->table_bU[U]; | |||
| #define YSCALE_YUV_2_RGBX_FULL_C(rnd,alpha) \ | |||
| for (i=0; i<dstW; i++) {\ | |||
| @@ -807,13 +921,7 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK); | |||
| B = av_clip_uintp2(B, 30); \ | |||
| } | |||
| #define YSCALE_YUV_2_RGBX_C(type,alpha) \ | |||
| YSCALE_YUV_2_PACKEDX_C(type,alpha) /* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/\ | |||
| r = (type *)c->table_rV[V]; \ | |||
| g = (type *)(c->table_gU[U] + c->table_gV[V]); \ | |||
| b = (type *)c->table_bU[U]; | |||
| #define YSCALE_YUV_2_PACKED2_C(type,alpha) \ | |||
| #define YSCALE_YUV_2_RGB2_C(type,alpha) \ | |||
| for (i=0; i<(dstW>>1); i++) { \ | |||
| const int i2= 2*i; \ | |||
| int Y1= (buf0[i2 ]*yalpha1+buf1[i2 ]*yalpha)>>19; \ | |||
| @@ -825,15 +933,12 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK); | |||
| if (alpha) {\ | |||
| A1= (abuf0[i2 ]*yalpha1+abuf1[i2 ]*yalpha)>>19; \ | |||
| A2= (abuf0[i2+1]*yalpha1+abuf1[i2+1]*yalpha)>>19; \ | |||
| } | |||
| #define YSCALE_YUV_2_RGB2_C(type,alpha) \ | |||
| YSCALE_YUV_2_PACKED2_C(type,alpha)\ | |||
| }\ | |||
| r = (type *)c->table_rV[V];\ | |||
| g = (type *)(c->table_gU[U] + c->table_gV[V]);\ | |||
| b = (type *)c->table_bU[U]; | |||
| #define YSCALE_YUV_2_PACKED1_C(type,alpha) \ | |||
| #define YSCALE_YUV_2_RGB1_C(type,alpha) \ | |||
| for (i=0; i<(dstW>>1); i++) {\ | |||
| const int i2= 2*i;\ | |||
| int Y1= buf0[i2 ]>>7;\ | |||
| @@ -845,15 +950,12 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK); | |||
| if (alpha) {\ | |||
| A1= abuf0[i2 ]>>7;\ | |||
| A2= abuf0[i2+1]>>7;\ | |||
| } | |||
| #define YSCALE_YUV_2_RGB1_C(type,alpha) \ | |||
| YSCALE_YUV_2_PACKED1_C(type,alpha)\ | |||
| }\ | |||
| r = (type *)c->table_rV[V];\ | |||
| g = (type *)(c->table_gU[U] + c->table_gV[V]);\ | |||
| b = (type *)c->table_bU[U]; | |||
| #define YSCALE_YUV_2_PACKED1B_C(type,alpha) \ | |||
| #define YSCALE_YUV_2_RGB1B_C(type,alpha) \ | |||
| for (i=0; i<(dstW>>1); i++) {\ | |||
| const int i2= 2*i;\ | |||
| int Y1= buf0[i2 ]>>7;\ | |||
| @@ -865,15 +967,12 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK); | |||
| if (alpha) {\ | |||
| A1= abuf0[i2 ]>>7;\ | |||
| A2= abuf0[i2+1]>>7;\ | |||
| } | |||
| #define YSCALE_YUV_2_RGB1B_C(type,alpha) \ | |||
| YSCALE_YUV_2_PACKED1B_C(type,alpha)\ | |||
| }\ | |||
| r = (type *)c->table_rV[V];\ | |||
| g = (type *)(c->table_gU[U] + c->table_gV[V]);\ | |||
| b = (type *)c->table_bU[U]; | |||
| #define YSCALE_YUV_2_ANYRGB_C(func, func2)\ | |||
| #define YSCALE_YUV_2_ANYRGB_C(func)\ | |||
| switch(c->dstFormat) {\ | |||
| case PIX_FMT_RGB48BE:\ | |||
| case PIX_FMT_RGB48LE:\ | |||
| @@ -1049,22 +1148,6 @@ YUV2PACKEDWRAPPER(yuv2mono, black, PIX_FMT_MONOBLACK); | |||
| }\ | |||
| }\ | |||
| break;\ | |||
| case PIX_FMT_YUYV422:\ | |||
| func2\ | |||
| ((uint8_t*)dest)[2*i2+0]= Y1;\ | |||
| ((uint8_t*)dest)[2*i2+1]= U;\ | |||
| ((uint8_t*)dest)[2*i2+2]= Y2;\ | |||
| ((uint8_t*)dest)[2*i2+3]= V;\ | |||
| } \ | |||
| break;\ | |||
| case PIX_FMT_UYVY422:\ | |||
| func2\ | |||
| ((uint8_t*)dest)[2*i2+0]= U;\ | |||
| ((uint8_t*)dest)[2*i2+1]= Y1;\ | |||
| ((uint8_t*)dest)[2*i2+2]= V;\ | |||
| ((uint8_t*)dest)[2*i2+3]= Y2;\ | |||
| } \ | |||
| break;\ | |||
| } | |||
| static void yuv2packedX_c(SwsContext *c, const int16_t *lumFilter, | |||
| @@ -1074,7 +1157,7 @@ static void yuv2packedX_c(SwsContext *c, const int16_t *lumFilter, | |||
| const int16_t **alpSrc, uint8_t *dest, int dstW, int y) | |||
| { | |||
| int i; | |||
| YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C, YSCALE_YUV_2_PACKEDX_C(void,0)) | |||
| YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C) | |||
| } | |||
| static void yuv2rgbX_c_full(SwsContext *c, const int16_t *lumFilter, | |||
| @@ -1177,7 +1260,7 @@ static void yuv2packed2_c(SwsContext *c, const uint16_t *buf0, | |||
| int uvalpha1=4095-uvalpha; | |||
| int i; | |||
| YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C, YSCALE_YUV_2_PACKED2_C(void,0)) | |||
| YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C) | |||
| } | |||
| /** | |||
| @@ -1193,9 +1276,9 @@ static void yuv2packed1_c(SwsContext *c, const uint16_t *buf0, | |||
| int i; | |||
| if (uvalpha < 2048) { | |||
| YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C, YSCALE_YUV_2_PACKED1_C(void,0)) | |||
| YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C) | |||
| } else { | |||
| YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C, YSCALE_YUV_2_PACKED1B_C(void,0)) | |||
| YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C) | |||
| } | |||
| } | |||
| @@ -1886,7 +1969,7 @@ find_c_packed_planar_out_funcs(SwsContext *c, | |||
| } else if (is16BPS(dstFormat)) { | |||
| *yuv2yuvX = isBE(dstFormat) ? yuv2yuvX16BE_c : yuv2yuvX16LE_c; | |||
| } else if (is9_OR_10BPS(dstFormat)) { | |||
| if (dstFormat == PIX_FMT_YUV420P9BE || dstFormat == PIX_FMT_YUV420P9LE) { | |||
| if (av_pix_fmt_descriptors[dstFormat].comp[0].depth_minus1 == 8) { | |||
| *yuv2yuvX = isBE(dstFormat) ? yuv2yuvX9BE_c : yuv2yuvX9LE_c; | |||
| } else { | |||
| *yuv2yuvX = isBE(dstFormat) ? yuv2yuvX10BE_c : yuv2yuvX10LE_c; | |||
| @@ -1919,6 +2002,16 @@ find_c_packed_planar_out_funcs(SwsContext *c, | |||
| *yuv2packed2 = yuv2monoblack_2_c; | |||
| *yuv2packedX = yuv2monoblack_X_c; | |||
| break; | |||
| case PIX_FMT_YUYV422: | |||
| *yuv2packed1 = yuv2422yuyv_1_c; | |||
| *yuv2packed2 = yuv2422yuyv_2_c; | |||
| *yuv2packedX = yuv2422yuyv_X_c; | |||
| break; | |||
| case PIX_FMT_UYVY422: | |||
| *yuv2packed1 = yuv2422uyvy_1_c; | |||
| *yuv2packed2 = yuv2422uyvy_2_c; | |||
| *yuv2packedX = yuv2422uyvy_X_c; | |||
| break; | |||
| default: | |||
| *yuv2packed1 = yuv2packed1_c; | |||
| *yuv2packed2 = yuv2packed2_c; | |||
| @@ -2221,16 +2314,20 @@ static av_cold void sws_init_swScale_c(SwsContext *c) | |||
| case PIX_FMT_BGR4_BYTE: | |||
| case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV_c; break; | |||
| case PIX_FMT_GRAY16BE : | |||
| case PIX_FMT_YUV444P9BE: | |||
| case PIX_FMT_YUV420P9BE: | |||
| case PIX_FMT_YUV444P10BE: | |||
| case PIX_FMT_YUV422P10BE: | |||
| case PIX_FMT_YUV420P10BE: | |||
| case PIX_FMT_YUV420P16BE: | |||
| case PIX_FMT_YUV422P16BE: | |||
| case PIX_FMT_YUV444P16BE: c->hScale16= HAVE_BIGENDIAN ? hScale16_c : hScale16X_c; break; | |||
| case PIX_FMT_GRAY16LE : | |||
| case PIX_FMT_YUV444P9LE: | |||
| case PIX_FMT_YUV420P9LE: | |||
| case PIX_FMT_YUV422P10LE: | |||
| case PIX_FMT_YUV420P10LE: | |||
| case PIX_FMT_YUV444P10LE: | |||
| case PIX_FMT_YUV420P16LE: | |||
| case PIX_FMT_YUV422P16LE: | |||
| case PIX_FMT_YUV444P16LE: c->hScale16= HAVE_BIGENDIAN ? hScale16X_c : hScale16_c; break; | |||
| @@ -371,6 +371,12 @@ const char *sws_format_name(enum PixelFormat format); | |||
| #define isNBPS(x) ( \ | |||
| (x)==PIX_FMT_YUV420P9LE \ | |||
| || (x)==PIX_FMT_YUV420P9BE \ | |||
| || (x)==PIX_FMT_YUV444P9BE \ | |||
| || (x)==PIX_FMT_YUV444P9LE \ | |||
| || (x)==PIX_FMT_YUV422P10BE \ | |||
| || (x)==PIX_FMT_YUV422P10LE \ | |||
| || (x)==PIX_FMT_YUV444P10BE \ | |||
| || (x)==PIX_FMT_YUV444P10LE \ | |||
| || (x)==PIX_FMT_YUV420P10LE \ | |||
| || (x)==PIX_FMT_YUV420P10BE \ | |||
| || (x)==PIX_FMT_YUV422P10LE \ | |||
| @@ -392,13 +398,19 @@ const char *sws_format_name(enum PixelFormat format); | |||
| #define isPlanarYUV(x) ( \ | |||
| isPlanar8YUV(x) \ | |||
| || (x)==PIX_FMT_YUV420P9LE \ | |||
| || (x)==PIX_FMT_YUV444P9LE \ | |||
| || (x)==PIX_FMT_YUV420P10LE \ | |||
| || (x)==PIX_FMT_YUV422P10LE \ | |||
| || (x)==PIX_FMT_YUV444P10LE \ | |||
| || (x)==PIX_FMT_YUV420P16LE \ | |||
| || (x)==PIX_FMT_YUV422P10LE \ | |||
| || (x)==PIX_FMT_YUV422P16LE \ | |||
| || (x)==PIX_FMT_YUV444P16LE \ | |||
| || (x)==PIX_FMT_YUV420P9BE \ | |||
| || (x)==PIX_FMT_YUV444P9BE \ | |||
| || (x)==PIX_FMT_YUV420P10BE \ | |||
| || (x)==PIX_FMT_YUV422P10BE \ | |||
| || (x)==PIX_FMT_YUV444P10BE \ | |||
| || (x)==PIX_FMT_YUV420P16BE \ | |||
| || (x)==PIX_FMT_YUV422P10BE \ | |||
| || (x)==PIX_FMT_YUV422P16BE \ | |||
| @@ -112,12 +112,18 @@ const char *swscale_license(void) | |||
| || (x)==PIX_FMT_MONOWHITE \ | |||
| || (x)==PIX_FMT_MONOBLACK \ | |||
| || (x)==PIX_FMT_YUV420P9LE \ | |||
| || (x)==PIX_FMT_YUV444P9LE \ | |||
| || (x)==PIX_FMT_YUV420P10LE \ | |||
| || (x)==PIX_FMT_YUV422P10LE \ | |||
| || (x)==PIX_FMT_YUV444P10LE \ | |||
| || (x)==PIX_FMT_YUV420P16LE \ | |||
| || (x)==PIX_FMT_YUV422P16LE \ | |||
| || (x)==PIX_FMT_YUV444P16LE \ | |||
| || (x)==PIX_FMT_YUV420P9BE \ | |||
| || (x)==PIX_FMT_YUV444P9BE \ | |||
| || (x)==PIX_FMT_YUV420P10BE \ | |||
| || (x)==PIX_FMT_YUV444P10BE \ | |||
| || (x)==PIX_FMT_YUV422P10BE \ | |||
| || (x)==PIX_FMT_YUV420P16BE \ | |||
| || (x)==PIX_FMT_YUV422P16BE \ | |||
| || (x)==PIX_FMT_YUV444P16BE \ | |||