[FFmpeg-cvslog] opusenc: implement a psychoacoustic system
ffmpeg | branch: master | Rostislav Pehlivanov | Sat Sep 23 00:38:37 2017 +0100| [2ad1768c7b48b6c77bbe9c42a4c2744f7b029182] | committer: Rostislav Pehlivanov opusenc: implement a psychoacoustic system This commit implements a psychoacoustic system for the native Opus encoder. Its unlike any other psychoacoustic system known since its capable of using a lookahead to make better choices on how to treat the current frame and how many bits to allocate for it (and future frames). Also, whilst the main bulk of the analysis function has to run in a single thread, the per-frame anaylsis functions does not modify the main psychoacoustic context, so in the future it will be fairly trivial to run those as slice threads. Signed-off-by: Rostislav Pehlivanov > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2ad1768c7b48b6c77bbe9c42a4c2744f7b029182 --- libavcodec/Makefile| 3 +- libavcodec/opus_celt.h | 6 + libavcodec/opusenc.c | 270 -- libavcodec/opusenc.h | 56 + libavcodec/opusenc_psy.c | 556 + libavcodec/opusenc_psy.h | 104 + libavcodec/opusenc_utils.h | 82 +++ 7 files changed, 951 insertions(+), 126 deletions(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index fa0cb97a4d..97969a085d 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -467,7 +467,8 @@ OBJS-$(CONFIG_NUV_DECODER) += nuv.o rtjpeg.o OBJS-$(CONFIG_ON2AVC_DECODER) += on2avc.o on2avcdata.o OBJS-$(CONFIG_OPUS_DECODER)+= opusdec.o opus.o opus_celt.o opus_rc.o \ opus_pvq.o opus_silk.o opustab.o vorbis_data.o -OBJS-$(CONFIG_OPUS_ENCODER)+= opusenc.o opus_rc.o opustab.o opus_pvq.o +OBJS-$(CONFIG_OPUS_ENCODER)+= opusenc.o opus_rc.o opustab.o opus_pvq.o \ + opusenc_psy.o OBJS-$(CONFIG_PAF_AUDIO_DECODER) += pafaudio.o OBJS-$(CONFIG_PAF_VIDEO_DECODER) += pafvideo.o OBJS-$(CONFIG_PAM_DECODER) += pnmdec.o pnm.o diff --git a/libavcodec/opus_celt.h b/libavcodec/opus_celt.h index 31299912bd..45d50ab27b 100644 --- a/libavcodec/opus_celt.h +++ b/libavcodec/opus_celt.h @@ -120,6 +120,12 @@ struct CeltFrame { uint32_t seed; enum CeltSpread spread; +/* Encoder PF coeffs */ +int pf_octave; +int pf_period; +int pf_tapset; +float pf_gain; + /* Bit allocation */ int framebits; int remaining; diff --git a/libavcodec/opusenc.c b/libavcodec/opusenc.c index 8f2da4a7ba..79d20dc6e6 100644 --- a/libavcodec/opusenc.c +++ b/libavcodec/opusenc.c @@ -19,8 +19,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "opus_celt.h" +#include "opusenc.h" #include "opus_pvq.h" +#include "opusenc_psy.h" #include "opustab.h" #include "libavutil/float_dsp.h" @@ -29,28 +30,10 @@ #include "bytestream.h" #include "audio_frame_queue.h" -/* Determines the maximum delay the psychoacoustic system will use for lookahead */ -#define FF_BUFQUEUE_SIZE 145 -#include "libavfilter/bufferqueue.h" - -#define OPUS_MAX_LOOKAHEAD ((FF_BUFQUEUE_SIZE - 1)*2.5f) - -#define OPUS_MAX_CHANNELS 2 - -/* 120 ms / 2.5 ms = 48 frames (extremely improbable, but the encoder'll work) */ -#define OPUS_MAX_FRAMES_PER_PACKET 48 - -#define OPUS_BLOCK_SIZE(x) (2 * 15 * (1 << ((x) + 2))) - -#define OPUS_SAMPLES_TO_BLOCK_SIZE(x) (ff_log2((x) / (2 * 15)) - 2) - -typedef struct OpusEncOptions { -float max_delay_ms; -} OpusEncOptions; - typedef struct OpusEncContext { AVClass *av_class; OpusEncOptions options; +OpusPsyContext psyctx; AVCodecContext *avctx; AudioFrameQueue afq; AVFloatDSPContext *dsp; @@ -58,10 +41,10 @@ typedef struct OpusEncContext { CeltPVQ *pvq; struct FFBufQueue bufqueue; -enum OpusMode mode; -enum OpusBandwidth bandwidth; -int pkt_framesize; -int pkt_frames; +uint8_t enc_id[64]; +int enc_id_bits; + +OpusPacketInfo packet; int channels; @@ -100,18 +83,18 @@ static int opus_gen_toc(OpusEncContext *s, uint8_t *toc, int *size, int *fsize_n { { 3, 7, 11, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }, /* 40 ms */ { { 4, 8, 12, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }, /* 60 ms */ }; -int cfg = toc_cfg[s->pkt_framesize][s->mode][s->bandwidth]; +int cfg = toc_cfg[s->packet.framesize][s->packet.mode][s->packet.bandwidth]; *fsize_needed = 0; if (!cfg) return 1; -if (s->pkt_frames == 2) { /* 2 packets */ +if (s->packet.frames == 2) { /* 2 packets */ if (s->frame[0].framebits == s->frame[1].framebits) { /* same size */ tmp = 0x1; } else { /* different
[FFmpeg-cvslog] lavfi: make window_func an inline function
ffmpeg | branch: master | Rostislav Pehlivanov | Sat Sep 23 14:21:22 2017 +0100| [039ebaa5f39ef45444f3cc42ab2ff71b0e9a1161] | committer: Rostislav Pehlivanov lavfi: make window_func an inline function Eliminate lavc->lavfi dependency. The function isn't big and doesn't deserve its own file. Signed-off-by: Rostislav Pehlivanov > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=039ebaa5f39ef45444f3cc42ab2ff71b0e9a1161 --- libavcodec/opusenc_psy.c| 2 +- libavfilter/Makefile| 10 +-- libavfilter/af_afftfilt.c | 2 +- libavfilter/avf_showfreqs.c | 2 +- libavfilter/avf_showspectrum.c | 2 +- libavfilter/vaf_spectrumsynth.c | 2 +- libavfilter/window_func.c | 178 libavfilter/window_func.h | 158 ++- 8 files changed, 167 insertions(+), 189 deletions(-) diff --git a/libavcodec/opusenc_psy.c b/libavcodec/opusenc_psy.c index 7c356fc568..e6858f1856 100644 --- a/libavcodec/opusenc_psy.c +++ b/libavcodec/opusenc_psy.c @@ -507,7 +507,7 @@ av_cold int ff_opus_psy_init(OpusPsyContext *s, AVCodecContext *avctx, ret = AVERROR(ENOMEM); goto fail; } -ff_generate_window_func(s->window[i], 2*len, WFUNC_SINE, &tmp); +generate_window_func(s->window[i], 2*len, WFUNC_SINE, &tmp); if ((ret = ff_mdct15_init(&s->mdct[i], 0, i + 3, 68 << (CELT_BLOCK_NB - 1 - i goto fail; } diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 98acb51bcb..9eeb7d218f 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -37,7 +37,7 @@ OBJS-$(CONFIG_AECHO_FILTER) += af_aecho.o OBJS-$(CONFIG_AEMPHASIS_FILTER) += af_aemphasis.o OBJS-$(CONFIG_AEVAL_FILTER) += aeval.o OBJS-$(CONFIG_AFADE_FILTER) += af_afade.o -OBJS-$(CONFIG_AFFTFILT_FILTER) += af_afftfilt.o window_func.o +OBJS-$(CONFIG_AFFTFILT_FILTER) += af_afftfilt.o OBJS-$(CONFIG_AFIR_FILTER) += af_afir.o OBJS-$(CONFIG_AFORMAT_FILTER)+= af_aformat.o OBJS-$(CONFIG_AGATE_FILTER) += af_agate.o @@ -369,13 +369,13 @@ OBJS-$(CONFIG_APHASEMETER_FILTER)+= avf_aphasemeter.o OBJS-$(CONFIG_AVECTORSCOPE_FILTER) += avf_avectorscope.o OBJS-$(CONFIG_CONCAT_FILTER) += avf_concat.o OBJS-$(CONFIG_SHOWCQT_FILTER)+= avf_showcqt.o lswsutils.o lavfutils.o -OBJS-$(CONFIG_SHOWFREQS_FILTER) += avf_showfreqs.o window_func.o -OBJS-$(CONFIG_SHOWSPECTRUM_FILTER) += avf_showspectrum.o window_func.o -OBJS-$(CONFIG_SHOWSPECTRUMPIC_FILTER)+= avf_showspectrum.o window_func.o +OBJS-$(CONFIG_SHOWFREQS_FILTER) += avf_showfreqs.o +OBJS-$(CONFIG_SHOWSPECTRUM_FILTER) += avf_showspectrum.o +OBJS-$(CONFIG_SHOWSPECTRUMPIC_FILTER)+= avf_showspectrum.o OBJS-$(CONFIG_SHOWVOLUME_FILTER) += avf_showvolume.o OBJS-$(CONFIG_SHOWWAVES_FILTER) += avf_showwaves.o OBJS-$(CONFIG_SHOWWAVESPIC_FILTER) += avf_showwaves.o -OBJS-$(CONFIG_SPECTRUMSYNTH_FILTER) += vaf_spectrumsynth.o window_func.o +OBJS-$(CONFIG_SPECTRUMSYNTH_FILTER) += vaf_spectrumsynth.o # multimedia sources OBJS-$(CONFIG_AMOVIE_FILTER) += src_movie.o diff --git a/libavfilter/af_afftfilt.c b/libavfilter/af_afftfilt.c index d166fa4190..52755a1fb4 100644 --- a/libavfilter/af_afftfilt.c +++ b/libavfilter/af_afftfilt.c @@ -166,7 +166,7 @@ static int config_input(AVFilterLink *inlink) sizeof(*s->window_func_lut)); if (!s->window_func_lut) return AVERROR(ENOMEM); -ff_generate_window_func(s->window_func_lut, s->window_size, s->win_func, &overlap); +generate_window_func(s->window_func_lut, s->window_size, s->win_func, &overlap); if (s->overlap == 1) s->overlap = overlap; diff --git a/libavfilter/avf_showfreqs.c b/libavfilter/avf_showfreqs.c index 068ff1fb88..22f28ec387 100644 --- a/libavfilter/avf_showfreqs.c +++ b/libavfilter/avf_showfreqs.c @@ -218,7 +218,7 @@ static int config_output(AVFilterLink *outlink) sizeof(*s->window_func_lut)); if (!s->window_func_lut) return AVERROR(ENOMEM); -ff_generate_window_func(s->window_func_lut, s->win_size, s->win_func, &overlap); +generate_window_func(s->window_func_lut, s->win_size, s->win_func, &overlap); if (s->overlap == 1.) s->overlap = overlap; s->hop_size = (1. - s->overlap) * s->win_size; diff --git a/libavfilter/avf_showspectrum.c b/libavfilter/avf_showspectrum.c index 4317161d79..956f62f3ad 100644 --- a/libavfilter/avf_showspectrum.c +++ b/libavfilter/avf_showspectrum.c @@ -403,7 +403,7 @@ static int config_output(AVFilterLink *outlink) sizeof(*s->window_func_lut)); if (!s->wind
[FFmpeg-cvslog] avcodec/opusenc_psy: use av_clip_uintp2()
ffmpeg | branch: master | James Almer | Sat Sep 23 13:23:27 2017 -0300| [e4fd7b1fea7e2d3306f159d285ea420a1f250dcc] | committer: James Almer avcodec/opusenc_psy: use av_clip_uintp2() Fixes fate-source. Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e4fd7b1fea7e2d3306f159d285ea420a1f250dcc --- libavcodec/opusenc_psy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/opusenc_psy.c b/libavcodec/opusenc_psy.c index e6858f1856..bb673bef68 100644 --- a/libavcodec/opusenc_psy.c +++ b/libavcodec/opusenc_psy.c @@ -299,7 +299,7 @@ static void celt_gauge_psy_weight(OpusPsyContext *s, OpusPsyStep **start, } tonal /= 1333136.0f; -f_out->spread = av_clip(lrintf(tonal), 0, 3); +f_out->spread = av_clip_uintp2(lrintf(tonal), 2); rate = ((float)s->avctx->bit_rate) + frame_bits*frame_size*16; rate *= s->lambda; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/opusenc_utils: add missing preprocessor guards
ffmpeg | branch: master | James Almer | Sat Sep 23 13:22:51 2017 -0300| [b8eaecbf39a59fce256ee5ffa7c51dd44c83bec1] | committer: James Almer avcodec/opusenc_utils: add missing preprocessor guards Fixes fate-source. Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b8eaecbf39a59fce256ee5ffa7c51dd44c83bec1 --- libavcodec/opusenc_utils.h | 5 + 1 file changed, 5 insertions(+) diff --git a/libavcodec/opusenc_utils.h b/libavcodec/opusenc_utils.h index 8b9c5bffaf..be82e13767 100644 --- a/libavcodec/opusenc_utils.h +++ b/libavcodec/opusenc_utils.h @@ -19,6 +19,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifndef AVCODEC_OPUSENC_UTILS_H +#define AVCODEC_OPUSENC_UTILS_H + #include "opus.h" typedef struct FFBesselFilter { @@ -80,3 +83,5 @@ static inline float bessel_filter(FFBesselFilter *s, float x) s->y[0] = s->a[0]*s->x[0] + s->a[1]*s->x[1] + s->a[2]*s->x[2] + s->b[0]*s->y[1] + s->b[1]*s->y[2]; return s->y[0]; } + +#endif /* AVCODEC_OPUSENC_UTILS_H */ ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avformat/mxfdec: use the common packet pts setter function for opatom files
ffmpeg | branch: master | Marton Balint | Thu Sep 7 16:17:59 2017 +0200| [01911b9b3cad85ff1c346165659c0181db661b3e] | committer: Marton Balint avformat/mxfdec: use the common packet pts setter function for opatom files Fixes ticket #6631. Signed-off-by: Marton Balint > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=01911b9b3cad85ff1c346165659c0181db661b3e --- libavformat/mxfdec.c | 12 +++- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 3e2f5011ee..476d284c96 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -3217,15 +3217,9 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) pkt->stream_index = st->index; -if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && t->ptses && -mxf->current_edit_unit >= 0 && mxf->current_edit_unit < t->nb_ptses) { -pkt->dts = mxf->current_edit_unit + t->first_dts; -pkt->pts = t->ptses[mxf->current_edit_unit]; -} else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { -int ret = mxf_set_audio_pts(mxf, st->codecpar, pkt); -if (ret < 0) -return ret; -} +ret = mxf_set_pts(mxf, st, pkt, next_pos); +if (ret < 0) +return ret; mxf->current_edit_unit += edit_units; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avformat/mxfdec: factorize packet pts setter function
ffmpeg | branch: master | Marton Balint | Thu Sep 7 16:09:13 2017 +0200| [7f80b065a626f3214ad90039c45efa390099572c] | committer: Marton Balint avformat/mxfdec: factorize packet pts setter function Signed-off-by: Marton Balint > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7f80b065a626f3214ad90039c45efa390099572c --- libavformat/mxfdec.c | 52 +--- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 91731a7533..3e2f5011ee 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -3060,6 +3060,32 @@ static int mxf_set_audio_pts(MXFContext *mxf, AVCodecParameters *par, return 0; } +static int mxf_set_pts(MXFContext *mxf, AVStream *st, AVPacket *pkt, int64_t next_ofs) +{ +AVCodecParameters *par = st->codecpar; +MXFTrack *track = st->priv_data; + +if (par->codec_type == AVMEDIA_TYPE_VIDEO && next_ofs >= 0) { +/* mxf->current_edit_unit good - see if we have an + * index table to derive timestamps from */ +MXFIndexTable *t = &mxf->index_tables[0]; + +if (mxf->nb_index_tables >= 1 && mxf->current_edit_unit < t->nb_ptses) { +pkt->dts = mxf->current_edit_unit + t->first_dts; +pkt->pts = t->ptses[mxf->current_edit_unit]; +} else if (track && track->intra_only) { +/* intra-only -> PTS = EditUnit. + * let utils.c figure out DTS since it can be < PTS if low_delay = 0 (Sony IMX30) */ +pkt->pts = mxf->current_edit_unit; +} +} else if (par->codec_type == AVMEDIA_TYPE_AUDIO) { +int ret = mxf_set_audio_pts(mxf, par, pkt); +if (ret < 0) +return ret; +} +return 0; +} + static int mxf_read_packet_old(AVFormatContext *s, AVPacket *pkt) { KLVPacket klv; @@ -3083,8 +3109,6 @@ static int mxf_read_packet_old(AVFormatContext *s, AVPacket *pkt) int index = mxf_get_stream_index(s, &klv); int64_t next_ofs, next_klv; AVStream *st; -MXFTrack *track; -AVCodecParameters *par; if (index < 0) { av_log(s, AV_LOG_ERROR, @@ -3094,7 +3118,6 @@ static int mxf_read_packet_old(AVFormatContext *s, AVPacket *pkt) } st = s->streams[index]; -track = st->priv_data; if (s->streams[index]->discard == AVDISCARD_ALL) goto skip; @@ -3129,26 +3152,9 @@ static int mxf_read_packet_old(AVFormatContext *s, AVPacket *pkt) pkt->stream_index = index; pkt->pos = klv.offset; -par = st->codecpar; - -if (par->codec_type == AVMEDIA_TYPE_VIDEO && next_ofs >= 0) { -/* mxf->current_edit_unit good - see if we have an - * index table to derive timestamps from */ -MXFIndexTable *t = &mxf->index_tables[0]; - -if (mxf->nb_index_tables >= 1 && mxf->current_edit_unit < t->nb_ptses) { -pkt->dts = mxf->current_edit_unit + t->first_dts; -pkt->pts = t->ptses[mxf->current_edit_unit]; -} else if (track && track->intra_only) { -/* intra-only -> PTS = EditUnit. - * let utils.c figure out DTS since it can be < PTS if low_delay = 0 (Sony IMX30) */ -pkt->pts = mxf->current_edit_unit; -} -} else if (par->codec_type == AVMEDIA_TYPE_AUDIO) { -ret = mxf_set_audio_pts(mxf, par, pkt); -if (ret < 0) -return ret; -} +ret = mxf_set_pts(mxf, st, pkt, next_ofs); +if (ret < 0) +return ret; /* seek for truncated packets */ avio_seek(s->pb, next_klv, SEEK_SET); ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avfilter/interlace: add support for 10 and 12 bit
ffmpeg | branch: master | Thomas Mundt | Tue Sep 19 22:23:23 2017 +0200| [40bfaa190c61b6eeff1b76b767c12edd6609967d] | committer: James Almer avfilter/interlace: add support for 10 and 12 bit Reviewed-by: Michael Niedermayer Signed-off-by: Thomas Mundt Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=40bfaa190c61b6eeff1b76b767c12edd6609967d --- libavfilter/interlace.h| 5 +- libavfilter/tinterlace.h | 5 +- libavfilter/vf_interlace.c | 97 ++ libavfilter/vf_tinterlace.c| 78 +++-- libavfilter/x86/vf_interlace.asm | 80 +++-- libavfilter/x86/vf_interlace_init.c| 51 ++ libavfilter/x86/vf_tinterlace_init.c | 51 ++ tests/ref/fate/filter-pixfmts-tinterlace_cvlpf | 11 +++ tests/ref/fate/filter-pixfmts-tinterlace_merge | 11 +++ tests/ref/fate/filter-pixfmts-tinterlace_pad | 11 +++ tests/ref/fate/filter-pixfmts-tinterlace_vlpf | 11 +++ 11 files changed, 355 insertions(+), 56 deletions(-) diff --git a/libavfilter/interlace.h b/libavfilter/interlace.h index 2101b79939..90a0198bdc 100644 --- a/libavfilter/interlace.h +++ b/libavfilter/interlace.h @@ -25,9 +25,11 @@ #ifndef AVFILTER_INTERLACE_H #define AVFILTER_INTERLACE_H +#include "libavutil/bswap.h" #include "libavutil/common.h" #include "libavutil/imgutils.h" #include "libavutil/opt.h" +#include "libavutil/pixdesc.h" #include "avfilter.h" #include "formats.h" @@ -55,8 +57,9 @@ typedef struct InterlaceContext { enum ScanMode scan;// top or bottom field first scanning int lowpass; // enable or disable low pass filtering AVFrame *cur, *next; // the two frames from which the new one is obtained +const AVPixFmtDescriptor *csp; void (*lowpass_line)(uint8_t *dstp, ptrdiff_t linesize, const uint8_t *srcp, - ptrdiff_t mref, ptrdiff_t pref); + ptrdiff_t mref, ptrdiff_t pref, int clip_max); } InterlaceContext; void ff_interlace_init_x86(InterlaceContext *interlace); diff --git a/libavfilter/tinterlace.h b/libavfilter/tinterlace.h index cc13a6cc50..b5c39aac52 100644 --- a/libavfilter/tinterlace.h +++ b/libavfilter/tinterlace.h @@ -27,7 +27,9 @@ #ifndef AVFILTER_TINTERLACE_H #define AVFILTER_TINTERLACE_H +#include "libavutil/bswap.h" #include "libavutil/opt.h" +#include "libavutil/pixdesc.h" #include "drawutils.h" #include "avfilter.h" @@ -60,8 +62,9 @@ typedef struct TInterlaceContext { int black_linesize[4]; FFDrawContext draw; FFDrawColor color; +const AVPixFmtDescriptor *csp; void (*lowpass_line)(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp, - ptrdiff_t mref, ptrdiff_t pref); + ptrdiff_t mref, ptrdiff_t pref, int clip_max); } TInterlaceContext; void ff_tinterlace_init_x86(TInterlaceContext *interlace); diff --git a/libavfilter/vf_interlace.c b/libavfilter/vf_interlace.c index 55bf782af8..0fdfe70f4c 100644 --- a/libavfilter/vf_interlace.c +++ b/libavfilter/vf_interlace.c @@ -61,8 +61,8 @@ static const AVOption interlace_options[] = { AVFILTER_DEFINE_CLASS(interlace); static void lowpass_line_c(uint8_t *dstp, ptrdiff_t linesize, - const uint8_t *srcp, - ptrdiff_t mref, ptrdiff_t pref) + const uint8_t *srcp, ptrdiff_t mref, + ptrdiff_t pref, int clip_max) { const uint8_t *srcp_above = srcp + mref; const uint8_t *srcp_below = srcp + pref; @@ -75,9 +75,28 @@ static void lowpass_line_c(uint8_t *dstp, ptrdiff_t linesize, } } +static void lowpass_line_c_16(uint8_t *dst8, ptrdiff_t linesize, + const uint8_t *src8, ptrdiff_t mref, + ptrdiff_t pref, int clip_max) +{ +uint16_t *dstp = (uint16_t *)dst8; +const uint16_t *srcp = (const uint16_t *)src8; +const uint16_t *srcp_above = srcp + mref / 2; +const uint16_t *srcp_below = srcp + pref / 2; +int i, src_x; +for (i = 0; i < linesize; i++) { +// this calculation is an integer representation of +// '0.5 * current + 0.25 * above + 0.25 * below' +// '1 +' is for rounding. +src_x = av_le2ne16(srcp[i]) << 1; +dstp[i] = av_le2ne16((1 + src_x + av_le2ne16(srcp_above[i]) + + av_le2ne16(srcp_below[i])) >> 2); +} +} + static void lowpass_line_complex_c(uint8_t *dstp, ptrdiff_t linesize, - const uint8_t *srcp, - ptrdiff_t mref, ptrdiff_t pref) + const uint8_t *srcp, ptrdiff_t mref, + ptrdiff_t pref, int clip_max) { const uint8_t *srcp_above = srcp + mref; const uint8_t *srcp_
[FFmpeg-cvslog] avfilter/tinterlace: use drawutils for pad mode
ffmpeg | branch: master | Thomas Mundt | Mon Sep 18 23:57:17 2017 +0200| [58ca446672fec10e851b820ce7df64bd2d1f3a70] | committer: James Almer avfilter/tinterlace: use drawutils for pad mode Reviewed-by: Michael Niedermayer Signed-off-by: Thomas Mundt Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=58ca446672fec10e851b820ce7df64bd2d1f3a70 --- libavfilter/tinterlace.h| 3 +++ libavfilter/vf_tinterlace.c | 16 +++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/libavfilter/tinterlace.h b/libavfilter/tinterlace.h index 7f50d3c8ee..cc13a6cc50 100644 --- a/libavfilter/tinterlace.h +++ b/libavfilter/tinterlace.h @@ -28,6 +28,7 @@ #define AVFILTER_TINTERLACE_H #include "libavutil/opt.h" +#include "drawutils.h" #include "avfilter.h" #define TINTERLACE_FLAG_VLPF 01 @@ -57,6 +58,8 @@ typedef struct TInterlaceContext { AVFrame *next; uint8_t *black_data[4]; ///< buffer used to fill padded lines int black_linesize[4]; +FFDrawContext draw; +FFDrawColor color; void (*lowpass_line)(uint8_t *dstp, ptrdiff_t width, const uint8_t *srcp, ptrdiff_t mref, ptrdiff_t pref); } TInterlaceContext; diff --git a/libavfilter/vf_tinterlace.c b/libavfilter/vf_tinterlace.c index 9ae9daafc1..f934a06b69 100644 --- a/libavfilter/vf_tinterlace.c +++ b/libavfilter/vf_tinterlace.c @@ -156,21 +156,19 @@ static int config_out_props(AVFilterLink *outlink) av_make_q(2, 1)); if (tinterlace->mode == MODE_PAD) { -uint8_t black[4] = { 16, 128, 128, 16 }; -int i, ret; +uint8_t black[4] = { 0, 0, 0, 16 }; +int ret; +ff_draw_init(&tinterlace->draw, outlink->format, 0); +ff_draw_color(&tinterlace->draw, &tinterlace->color, black); if (ff_fmt_is_in(outlink->format, full_scale_yuvj_pix_fmts)) -black[0] = black[3] = 0; +tinterlace->color.comp[0].u8[0] = 0; ret = av_image_alloc(tinterlace->black_data, tinterlace->black_linesize, outlink->w, outlink->h, outlink->format, 16); if (ret < 0) return ret; -/* fill black picture with black */ -for (i = 0; i < 4 && tinterlace->black_data[i]; i++) { -int h = i == 1 || i == 2 ? AV_CEIL_RSHIFT(outlink->h, desc->log2_chroma_h) : outlink->h; -memset(tinterlace->black_data[i], black[i], - tinterlace->black_linesize[i] * h); -} +ff_fill_rectangle(&tinterlace->draw, &tinterlace->color, tinterlace->black_data, + tinterlace->black_linesize, 0, 0, outlink->w, outlink->h); } if (tinterlace->flags & (TINTERLACE_FLAG_VLPF | TINTERLACE_FLAG_CVLPF) && !(tinterlace->mode == MODE_INTERLEAVE_TOP ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/frame_thread_encoder: use av_packet_alloc()
ffmpeg | branch: master | James Almer | Sat Sep 23 17:50:58 2017 -0300| [015f976aaee5c8aee39276bc742cdbd32dd9dbf9] | committer: James Almer avcodec/frame_thread_encoder: use av_packet_alloc() Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=015f976aaee5c8aee39276bc742cdbd32dd9dbf9 --- libavcodec/frame_thread_encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index ffbf5caf29..215aee9fc0 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -70,7 +70,7 @@ static void * attribute_align_arg worker(void *v){ AVFrame *frame; Task task; -if(!pkt) pkt= av_mallocz(sizeof(*pkt)); +if(!pkt) pkt = av_packet_alloc(); if(!pkt) continue; av_init_packet(pkt); ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/Makefile: skip v4l2_m2m headers if needed
ffmpeg | branch: master | James Almer | Sat Sep 23 18:08:07 2017 -0300| [ff7f859c2595f4daf9397d70af1a4a5d9da0ca59] | committer: James Almer avcodec/Makefile: skip v4l2_m2m headers if needed Fixes checkheaders on systems where v4l2_m2m is unavailable. Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ff7f859c2595f4daf9397d70af1a4a5d9da0ca59 --- libavcodec/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 97969a085d..1b17c27408 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1059,6 +1059,7 @@ SKIPHEADERS-$(CONFIG_VAAPI)+= vaapi_decode.h vaapi_encode.h SKIPHEADERS-$(CONFIG_VDA) += vda.h vda_vt_internal.h SKIPHEADERS-$(CONFIG_VDPAU)+= vdpau.h vdpau_internal.h SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.h vda_vt_internal.h +SKIPHEADERS-$(CONFIG_V4L2_M2M) += v4l2_buffers.h v4l2_context.h v4l2_m2m.h TESTPROGS = avpacket\ celp_math \ ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/v4l2_m2m: add missing header inclusions
ffmpeg | branch: master | James Almer | Sat Sep 23 18:12:56 2017 -0300| [d1e7e4fbe2b07f191311cb56e82ef4c18fd0fda4] | committer: James Almer avcodec/v4l2_m2m: add missing header inclusions Should fix checkheaders on systems where v4l2_m2m is enabled. Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d1e7e4fbe2b07f191311cb56e82ef4c18fd0fda4 --- libavcodec/v4l2_buffers.h | 2 ++ libavcodec/v4l2_context.h | 2 ++ libavcodec/v4l2_m2m.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h index 8901a0952f..5d25a87750 100644 --- a/libavcodec/v4l2_buffers.h +++ b/libavcodec/v4l2_buffers.h @@ -24,6 +24,8 @@ #ifndef AVCODEC_V4L2_BUFFERS_H #define AVCODEC_V4L2_BUFFERS_H +#include + enum V4L2Buffer_status { V4L2BUF_AVAILABLE, V4L2BUF_IN_DRIVER, diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h index b6667a04e3..503cc36dc4 100644 --- a/libavcodec/v4l2_context.h +++ b/libavcodec/v4l2_context.h @@ -25,6 +25,8 @@ #define AVCODEC_V4L2_CONTEXT_H #include +#include + #include "libavcodec/avcodec.h" #include "libavutil/pixfmt.h" #include "libavutil/frame.h" diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h index 13e2285389..afa3987c46 100644 --- a/libavcodec/v4l2_m2m.h +++ b/libavcodec/v4l2_m2m.h @@ -27,6 +27,8 @@ #include #include #include +#include + #include "libavcodec/avcodec.h" #include "v4l2_context.h" ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avformat/mpeg: zero initialize idx_pkt
ffmpeg | branch: master | James Almer | Sat Sep 23 19:37:21 2017 -0300| [86be73c7c1a5c789ad971d4ec620edc839d46820] | committer: James Almer avformat/mpeg: zero initialize idx_pkt Prevents use of uninitialized stack. Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=86be73c7c1a5c789ad971d4ec620edc839d46820 --- libavformat/mpeg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 68a848a6f6..50fe7a1a76 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -884,7 +884,7 @@ static int vobsub_read_packet(AVFormatContext *s, AVPacket *pkt) FFDemuxSubtitlesQueue *q; AVIOContext *pb = vobsub->sub_ctx->pb; int ret, psize, total_read = 0, i; -AVPacket idx_pkt; +AVPacket idx_pkt = { 0 }; int64_t min_ts = INT64_MAX; int sid = 0; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] ffplay: zero initialize copy avpacket
ffmpeg | branch: master | James Almer | Sat Sep 23 20:13:58 2017 -0300| [5a9415533dd064d44605b3a3896a53377b7a5ca8] | committer: James Almer ffplay: zero initialize copy avpacket Prevents potential use of uninitialized stack. Signed-off-by: James Almer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5a9415533dd064d44605b3a3896a53377b7a5ca8 --- ffplay.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffplay.c b/ffplay.c index 66e3673d21..45f2d78443 100644 --- a/ffplay.c +++ b/ffplay.c @@ -2977,7 +2977,7 @@ static int read_thread(void *arg) } if (is->queue_attachments_req) { if (is->video_st && is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC) { -AVPacket copy; +AVPacket copy = { 0 }; if ((ret = av_copy_packet(©, &is->video_st->attached_pic)) < 0) goto fail; packet_queue_put(&is->videoq, ©); ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] libavdevice/v4l2: fix invalid access to struct v4l2_buffer
ffmpeg | branch: master | Jaroslav Beran | Wed Sep 20 15:14:54 2017 +0200| [00a1e1337f22376909338a5319a378b2e2afdde8] | committer: Michael Niedermayer libavdevice/v4l2: fix invalid access to struct v4l2_buffer In case we are short of queued buffers, at first v4l2_buffer was enqueued to kernel so it's not owned by user-space anymore. After that it's timestamp field was read, but it might be overwritten by driver at that moment. It resulted in invalid timestamp sometimes. Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=00a1e1337f22376909338a5319a378b2e2afdde8 --- libavdevice/v4l2.c | 5 - 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index 17451cdb60..f087badf5c 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -492,6 +492,7 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt) .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, .memory = V4L2_MEMORY_MMAP }; +struct timeval buf_ts; int res; pkt->size = 0; @@ -508,6 +509,8 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt) return res; } +buf_ts = buf.timestamp; + if (buf.index >= s->buffers) { av_log(ctx, AV_LOG_ERROR, "Invalid buffer index received.\n"); return AVERROR(EINVAL); @@ -583,7 +586,7 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt) return AVERROR(ENOMEM); } } -pkt->pts = buf.timestamp.tv_sec * INT64_C(100) + buf.timestamp.tv_usec; +pkt->pts = buf_ts.tv_sec * INT64_C(100) + buf_ts.tv_usec; convert_timestamp(ctx, &pkt->pts); return pkt->size; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/mips: Improve avc chroma horiz mc msa functions
ffmpeg | branch: master | Kaustubh Raste | Thu Sep 21 19:47:39 2017 +0530| [16adbfe60c35d42f440ec7ed4c320282333602ba] | committer: Michael Niedermayer avcodec/mips: Improve avc chroma horiz mc msa functions Replace generic with block size specific function. Signed-off-by: Kaustubh Raste Reviewed-by: Manojkumar Bhosale Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=16adbfe60c35d42f440ec7ed4c320282333602ba --- libavcodec/mips/h264chroma_msa.c | 231 ++- 1 file changed, 133 insertions(+), 98 deletions(-) diff --git a/libavcodec/mips/h264chroma_msa.c b/libavcodec/mips/h264chroma_msa.c index 940e12db31..c27830d760 100644 --- a/libavcodec/mips/h264chroma_msa.c +++ b/libavcodec/mips/h264chroma_msa.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Shivraj Patil (shivraj.pa...@imgtec.com) + * Copyright (c) 2015 - 2017 Shivraj Patil (shivraj.pa...@imgtec.com) * * This file is part of FFmpeg. * @@ -29,8 +29,7 @@ static const uint8_t chroma_mask_arr[16 * 5] = { 0, 1, 1, 2, 16, 17, 17, 18, 16, 17, 17, 18, 18, 19, 19, 20 }; -static void avc_chroma_hz_2x2_msa(uint8_t *src, int32_t src_stride, - uint8_t *dst, int32_t dst_stride, +static void avc_chroma_hz_2x2_msa(uint8_t *src, uint8_t *dst, int32_t stride, uint32_t coeff0, uint32_t coeff1) { uint16_t out0, out1; @@ -44,7 +43,7 @@ static void avc_chroma_hz_2x2_msa(uint8_t *src, int32_t src_stride, mask = LD_SB(&chroma_mask_arr[0]); -LD_SB2(src, src_stride, src0, src1); +LD_SB2(src, stride, src0, src1); src0 = __msa_vshf_b(mask, src1, src0); res_r = __msa_dotp_u_h((v16u8) src0, coeff_vec); @@ -57,12 +56,11 @@ static void avc_chroma_hz_2x2_msa(uint8_t *src, int32_t src_stride, out1 = __msa_copy_u_h(res, 2); SH(out0, dst); -dst += dst_stride; +dst += stride; SH(out1, dst); } -static void avc_chroma_hz_2x4_msa(uint8_t *src, int32_t src_stride, - uint8_t *dst, int32_t dst_stride, +static void avc_chroma_hz_2x4_msa(uint8_t *src, uint8_t *dst, int32_t stride, uint32_t coeff0, uint32_t coeff1) { v16u8 src0, src1, src2, src3; @@ -75,7 +73,7 @@ static void avc_chroma_hz_2x4_msa(uint8_t *src, int32_t src_stride, mask = LD_SB(&chroma_mask_arr[64]); -LD_UB4(src, src_stride, src0, src1, src2, src3); +LD_UB4(src, stride, src0, src1, src2, src3); VSHF_B2_UB(src0, src1, src2, src3, mask, mask, src0, src2); @@ -87,64 +85,21 @@ static void avc_chroma_hz_2x4_msa(uint8_t *src, int32_t src_stride, res_r = __msa_sat_u_h(res_r, 7); res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r); -ST2x4_UB(res, 0, dst, dst_stride); -} - -static void avc_chroma_hz_2x8_msa(uint8_t *src, int32_t src_stride, - uint8_t *dst, int32_t dst_stride, - uint32_t coeff0, uint32_t coeff1) -{ -v16u8 src0, src1, src2, src3, src4, src5, src6, src7; -v8u16 res_r; -v8i16 res; -v16i8 mask; -v16i8 coeff_vec0 = __msa_fill_b(coeff0); -v16i8 coeff_vec1 = __msa_fill_b(coeff1); -v16u8 coeff_vec = (v16u8) __msa_ilvr_b(coeff_vec0, coeff_vec1); - -mask = LD_SB(&chroma_mask_arr[64]); - -LD_UB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7); - -VSHF_B2_UB(src0, src1, src2, src3, mask, mask, src0, src2); -VSHF_B2_UB(src4, src5, src6, src7, mask, mask, src4, src6); - -ILVR_D2_UB(src2, src0, src6, src4, src0, src4); - -res_r = __msa_dotp_u_h(src0, coeff_vec); -res_r <<= 3; -res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6); -res_r = __msa_sat_u_h(res_r, 7); -res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r); - -ST2x4_UB(res, 0, dst, dst_stride); -dst += (4 * dst_stride); - -res_r = __msa_dotp_u_h(src4, coeff_vec); -res_r <<= 3; -res_r = (v8u16) __msa_srari_h((v8i16) res_r, 6); -res_r = __msa_sat_u_h(res_r, 7); -res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r); - -ST2x4_UB(res, 0, dst, dst_stride); +ST2x4_UB(res, 0, dst, stride); } -static void avc_chroma_hz_2w_msa(uint8_t *src, int32_t src_stride, - uint8_t *dst, int32_t dst_stride, +static void avc_chroma_hz_2w_msa(uint8_t *src, uint8_t *dst, int32_t stride, uint32_t coeff0, uint32_t coeff1, int32_t height) { if (2 == height) { -avc_chroma_hz_2x2_msa(src, src_stride, dst, dst_stride, coeff0, coeff1); +avc_chroma_hz_2x2_msa(src, dst, stride, coeff0, coeff1); } else if (4 == height) { -avc_chroma_hz_2x4_msa(src, src_stride, dst, dst_stride, coeff0, coeff1); -} else if (8 == height) { -avc_chroma_hz_2x8_msa(src, src_stride, dst, dst_stride, coeff0, coeff1); +avc_chroma_hz_2x4_msa(s
[FFmpeg-cvslog] avcodec/flacenc: Replace "return -1" by named constant
ffmpeg | branch: master | Michael Niedermayer | Sat Sep 23 01:44:27 2017 +0200| [d8ef5a47bba85fa147ac53a9d9523b3eca031696] | committer: Michael Niedermayer avcodec/flacenc: Replace "return -1" by named constant Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d8ef5a47bba85fa147ac53a9d9523b3eca031696 --- libavcodec/flacenc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index 3575f5391d..170c3caf48 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -268,7 +268,7 @@ static av_cold int flac_encode_init(AVCodecContext *avctx) /* find samplerate in table */ if (freq < 1) -return -1; +return AVERROR(EINVAL); for (i = 4; i < 12; i++) { if (freq == ff_flac_sample_rate_table[i]) { s->samplerate = ff_flac_sample_rate_table[i]; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/snowenc: Replace "return -1" by named constants
ffmpeg | branch: master | Michael Niedermayer | Sat Sep 23 02:19:25 2017 +0200| [9cec1742475b0d8d9c8090b2c6e80f53d00727a9] | committer: Michael Niedermayer avcodec/snowenc: Replace "return -1" by named constants Reviewed-by: James Almer Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9cec1742475b0d8d9c8090b2c6e80f53d00727a9 --- libavcodec/snowenc.c | 11 ++- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c index bb113d0a2b..0d800b9f49 100644 --- a/libavcodec/snowenc.c +++ b/libavcodec/snowenc.c @@ -50,7 +50,7 @@ FF_ENABLE_DEPRECATION_WARNINGS && (avctx->flags & AV_CODEC_FLAG_QSCALE) && avctx->global_quality == 0){ av_log(avctx, AV_LOG_ERROR, "The 9/7 wavelet is incompatible with lossless mode.\n"); -return -1; +return AVERROR(EINVAL); } #if FF_API_MOTION_EST FF_DISABLE_DEPRECATION_WARNINGS @@ -107,8 +107,9 @@ FF_ENABLE_DEPRECATION_WARNINGS return AVERROR(ENOMEM); } if((avctx->flags&AV_CODEC_FLAG_PASS2) || !(avctx->flags&AV_CODEC_FLAG_QSCALE)){ -if(ff_rate_control_init(&s->m) < 0) -return -1; +ret = ff_rate_control_init(&s->m); +if(ret < 0) +return ret; } s->pass1_rc= !(avctx->flags & (AV_CODEC_FLAG_QSCALE|AV_CODEC_FLAG_PASS2)); @@ -130,7 +131,7 @@ FF_ENABLE_DEPRECATION_WARNINGS break;*/ default: av_log(avctx, AV_LOG_ERROR, "pixel format not supported\n"); -return -1; +return AVERROR_PATCHWELCOME; } avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); @@ -833,7 +834,7 @@ static int encode_subband_c0run(SnowContext *s, SubBand *b, const IDWTELEM *src, for(y=0; yc.bytestream_end - s->c.bytestream < w*40){ av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); -return -1; +return AVERROR(ENOMEM); } for(x=0; xhttp://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avcodec/mips: Improve hevc uni-w copy mc msa functions
ffmpeg | branch: master | Kaustubh Raste | Thu Sep 21 14:03:34 2017 +0530| [7f8417f22619366d848ee2ff71be14637b7b] | committer: Michael Niedermayer avcodec/mips: Improve hevc uni-w copy mc msa functions Load the specific destination bytes instead of MSA load and pack. Pack the data to half word before clipping. Use immediate unsigned saturation for clip to max saving one vector register. Signed-off-by: Kaustubh Raste Reviewed-by: Manojkumar Bhosale Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7f8417f22619366d848ee2ff71be14637b7b --- libavcodec/mips/hevc_mc_uniw_msa.c | 559 +--- libavutil/mips/generic_macros_msa.h | 30 ++ 2 files changed, 415 insertions(+), 174 deletions(-) diff --git a/libavcodec/mips/hevc_mc_uniw_msa.c b/libavcodec/mips/hevc_mc_uniw_msa.c index ce10f413ed..d18441957f 100644 --- a/libavcodec/mips/hevc_mc_uniw_msa.c +++ b/libavcodec/mips/hevc_mc_uniw_msa.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Manojkumar Bhosale (manojkumar.bhos...@imgtec.com) + * Copyright (c) 2015 - 2017 Manojkumar Bhosale (manojkumar.bhos...@imgtec.com) * * This file is part of FFmpeg. * @@ -62,6 +62,31 @@ out2_r, out3_r, out2_l, out3_l); \ } +#define HEVC_UNIW_RND_CLIP2_MAX_SATU_H(in0_h, in1_h, wgt_w, offset_h, rnd_w, \ + out0_h, out1_h)\ +{ \ +v4i32 in0_r_m, in0_l_m, in1_r_m, in1_l_m; \ + \ +ILVRL_H2_SW(in0_h, in0_h, in0_r_m, in0_l_m); \ +ILVRL_H2_SW(in1_h, in1_h, in1_r_m, in1_l_m); \ +DOTP_SH4_SW(in0_r_m, in1_r_m, in0_l_m, in1_l_m, wgt_w, wgt_w, wgt_w, \ +wgt_w, in0_r_m, in1_r_m, in0_l_m, in1_l_m); \ +SRAR_W4_SW(in0_r_m, in1_r_m, in0_l_m, in1_l_m, rnd_w);\ +PCKEV_H2_SH(in0_l_m, in0_r_m, in1_l_m, in1_r_m, out0_h, out1_h); \ +ADDS_SH2_SH(out0_h, offset_h, out1_h, offset_h, out0_h, out1_h); \ +CLIP_SH2_0_255_MAX_SATU(out0_h, out1_h); \ +} + +#define HEVC_UNIW_RND_CLIP4_MAX_SATU_H(in0_h, in1_h, in2_h, in3_h, wgt_w, \ + offset_h, rnd_w, out0_h, out1_h,\ + out2_h, out3_h) \ +{ \ +HEVC_UNIW_RND_CLIP2_MAX_SATU_H(in0_h, in1_h, wgt_w, offset_h, rnd_w, \ + out0_h, out1_h);\ +HEVC_UNIW_RND_CLIP2_MAX_SATU_H(in2_h, in3_h, wgt_w, offset_h, rnd_w, \ + out2_h, out3_h);\ +} + static void hevc_uniwgt_copy_4w_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, @@ -71,76 +96,60 @@ static void hevc_uniwgt_copy_4w_msa(uint8_t *src, int32_t offset, int32_t rnd_val) { +uint32_t loop_cnt, tp0, tp1, tp2, tp3; v16i8 zero = { 0 }; -v4i32 weight_vec, offset_vec, rnd_vec; +v16u8 out0, out1; +v16i8 src0 = { 0 }, src1 = { 0 }; +v8i16 dst0, dst1, dst2, dst3, offset_vec; +v4i32 weight_vec, rnd_vec; weight = weight & 0x; weight_vec = __msa_fill_w(weight); -offset_vec = __msa_fill_w(offset); +offset_vec = __msa_fill_h(offset); rnd_vec = __msa_fill_w(rnd_val); if (2 == height) { -v16i8 src0, src1; -v8i16 dst0; v4i32 dst0_r, dst0_l; -LD_SB2(src, src_stride, src0, src1); -src0 = (v16i8) __msa_ilvr_w((v4i32) src1, (v4i32) src0); +LW2(src, src_stride, tp0, tp1); +INSERT_W2_SB(tp0, tp1, src0); dst0 = (v8i16) __msa_ilvr_b(zero, src0); dst0 <<= 6; ILVRL_H2_SW(dst0, dst0, dst0_r, dst0_l); DOTP_SH2_SW(dst0_r, dst0_l, weight_vec, weight_vec, dst0_r, dst0_l); SRAR_W2_SW(dst0_r, dst0_l, rnd_vec); -ADD2(dst0_r, offset_vec, dst0_l, offset_vec, dst0_r, dst0_l); -dst0_r = CLIP_SW_0_255(dst0_r); -dst0_l = CLIP_SW_0_255(dst0_l); - -HEVC_PCK_SW_SB2(dst0_l, dst0_r, dst0_r); -ST4x2_UB(dst0_r, dst, dst_stride); +dst0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r); +dst0 += offset_vec; +dst0 = CLIP_SH_0_255_MAX_SATU(dst0); +out0 = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0); +ST4x2_UB(out0, dst, dst_stride); } else if (4 == height) { -v16i8 src0, src1, src2, src3; -v8i16 dst0, dst1; -v4i32 dst0_r, dst1_r; -v4i32 dst0_l, dst1_l; - -LD_SB4(src
[FFmpeg-cvslog] avcodec/mips: Unrolled loops avc intra msa functions
ffmpeg | branch: master | Kaustubh Raste | Thu Sep 21 19:20:30 2017 +0530| [d6737539e77e78fca9a04914d51996cfd1ccc55c] | committer: Michael Niedermayer avcodec/mips: Unrolled loops avc intra msa functions Signed-off-by: Kaustubh Raste Reviewed-by: Manojkumar Bhosale Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d6737539e77e78fca9a04914d51996cfd1ccc55c --- libavcodec/mips/h264pred_msa.c | 318 - 1 file changed, 158 insertions(+), 160 deletions(-) diff --git a/libavcodec/mips/h264pred_msa.c b/libavcodec/mips/h264pred_msa.c index cddcd2e878..c297aec879 100644 --- a/libavcodec/mips/h264pred_msa.c +++ b/libavcodec/mips/h264pred_msa.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Shivraj Patil (shivraj.pa...@imgtec.com) + * Copyright (c) 2015 - 2017 Shivraj Patil (shivraj.pa...@imgtec.com) * * This file is part of FFmpeg. * @@ -24,31 +24,21 @@ static void intra_predict_vert_8x8_msa(uint8_t *src, uint8_t *dst, int32_t dst_stride) { -uint32_t row; -uint32_t src_data1, src_data2; - -src_data1 = LW(src); -src_data2 = LW(src + 4); +uint64_t out = LD(src); -for (row = 8; row--;) { -SW(src_data1, dst); -SW(src_data2, (dst + 4)); -dst += dst_stride; -} +SD4(out, out, out, out, dst, dst_stride); +dst += (4 * dst_stride); +SD4(out, out, out, out, dst, dst_stride); } static void intra_predict_vert_16x16_msa(uint8_t *src, uint8_t *dst, int32_t dst_stride) { -uint32_t row; -v16u8 src0; - -src0 = LD_UB(src); +v16u8 out = LD_UB(src); -for (row = 16; row--;) { -ST_UB(src0, dst); -dst += dst_stride; -} +ST_UB8(out, out, out, out, out, out, out, out, dst, dst_stride); +dst += (8 * dst_stride); +ST_UB8(out, out, out, out, out, out, out, out, dst, dst_stride); } static void intra_predict_horiz_8x8_msa(uint8_t *src, int32_t src_stride, @@ -73,28 +63,47 @@ static void intra_predict_horiz_8x8_msa(uint8_t *src, int32_t src_stride, static void intra_predict_horiz_16x16_msa(uint8_t *src, int32_t src_stride, uint8_t *dst, int32_t dst_stride) { -uint32_t row; uint8_t inp0, inp1, inp2, inp3; -v16u8 src0, src1, src2, src3; - -for (row = 4; row--;) { -inp0 = src[0]; -src += src_stride; -inp1 = src[0]; -src += src_stride; -inp2 = src[0]; -src += src_stride; -inp3 = src[0]; -src += src_stride; - -src0 = (v16u8) __msa_fill_b(inp0); -src1 = (v16u8) __msa_fill_b(inp1); -src2 = (v16u8) __msa_fill_b(inp2); -src3 = (v16u8) __msa_fill_b(inp3); - -ST_UB4(src0, src1, src2, src3, dst, dst_stride); -dst += (4 * dst_stride); -} +v16u8 src0, src1, src2, src3, src4, src5, src6, src7; +v16u8 src8, src9, src10, src11, src12, src13, src14, src15; + +inp0 = src[0 * src_stride]; +inp1 = src[1 * src_stride]; +inp2 = src[2 * src_stride]; +inp3 = src[3 * src_stride]; +src0 = (v16u8) __msa_fill_b(inp0); +src1 = (v16u8) __msa_fill_b(inp1); +src2 = (v16u8) __msa_fill_b(inp2); +src3 = (v16u8) __msa_fill_b(inp3); +inp0 = src[4 * src_stride]; +inp1 = src[5 * src_stride]; +inp2 = src[6 * src_stride]; +inp3 = src[7 * src_stride]; +src4 = (v16u8) __msa_fill_b(inp0); +src5 = (v16u8) __msa_fill_b(inp1); +src6 = (v16u8) __msa_fill_b(inp2); +src7 = (v16u8) __msa_fill_b(inp3); +inp0 = src[ 8 * src_stride]; +inp1 = src[ 9 * src_stride]; +inp2 = src[10 * src_stride]; +inp3 = src[11 * src_stride]; +src8 = (v16u8) __msa_fill_b(inp0); +src9 = (v16u8) __msa_fill_b(inp1); +src10 = (v16u8) __msa_fill_b(inp2); +src11 = (v16u8) __msa_fill_b(inp3); +inp0 = src[12 * src_stride]; +inp1 = src[13 * src_stride]; +inp2 = src[14 * src_stride]; +inp3 = src[15 * src_stride]; +src12 = (v16u8) __msa_fill_b(inp0); +src13 = (v16u8) __msa_fill_b(inp1); +src14 = (v16u8) __msa_fill_b(inp2); +src15 = (v16u8) __msa_fill_b(inp3); + +ST_UB8(src0, src1, src2, src3, src4, src5, src6, src7, dst, dst_stride); +dst += (8 * dst_stride); +ST_UB8(src8, src9, src10, src11, src12, src13, src14, src15, + dst, dst_stride); } static void intra_predict_dc_8x8_msa(uint8_t *src_top, uint8_t *src_left, @@ -206,39 +215,29 @@ static void intra_predict_dc_16x16_msa(uint8_t *src_top, uint8_t *src_left, } } -#define INTRA_PREDICT_VALDC_8X8_MSA(val) \ -static void intra_predict_##val##dc_8x8_msa(uint8_t *dst,\ -int32_t dst_stride) \ -{\ -uint32_t row, out; \ -v16i8 store;