Merge commit '328cd2b599bc2d0d38f3c12606fa2a66eeec016e'
authorJames Almer <jamrial@gmail.com>
Fri, 7 Apr 2017 03:42:38 +0000 (00:42 -0300)
committerJames Almer <jamrial@gmail.com>
Fri, 7 Apr 2017 03:42:38 +0000 (00:42 -0300)
* commit '328cd2b599bc2d0d38f3c12606fa2a66eeec016e':
  lavc: move encoding-related code from utils.c to a new file

Merged-by: James Almer <jamrial@gmail.com>
1  2 
libavcodec/Makefile
libavcodec/encode.c
libavcodec/utils.c

diff --combined libavcodec/Makefile
@@@ -1,28 -1,20 +1,28 @@@
 +include $(SUBDIR)../config.mak
 +
  NAME = avcodec
  
  HEADERS = avcodec.h                                                     \
 +          avdct.h                                                       \
            avfft.h                                                       \
            d3d11va.h                                                     \
            dirac.h                                                       \
            dv_profile.h                                                  \
            dxva2.h                                                       \
 +          jni.h                                                         \
 +          mediacodec.h                                                  \
            qsv.h                                                         \
            vaapi.h                                                       \
            vda.h                                                         \
            vdpau.h                                                       \
            version.h                                                     \
 +          videotoolbox.h                                                \
            vorbis_parser.h                                               \
            xvmc.h                                                        \
  
  OBJS = allcodecs.o                                                      \
 +       audioconvert.o                                                   \
 +       avdct.o                                                          \
         avpacket.o                                                       \
         avpicture.o                                                      \
         bitstream.o                                                      \
         d3d11va.o                                                        \
         dirac.o                                                          \
         dv_profile.o                                                     \
+        encode.o                                                         \
         imgconvert.o                                                     \
 -       log2_tab.o                                                       \
 +       jni.o                                                            \
         mathtables.o                                                     \
 +       mediacodec.o                                                     \
         mpeg12framerate.o                                                \
         options.o                                                        \
 +       mjpegenc_huffman.o                                               \
         parser.o                                                         \
         profiles.o                                                       \
         qsv_api.o                                                        \
         raw.o                                                            \
 +       resample.o                                                       \
 +       resample2.o                                                      \
         utils.o                                                          \
         vorbis_parser.o                                                  \
         xiph.o                                                           \
@@@ -58,16 -47,13 +59,16 @@@ OBJS-$(CONFIG_AUDIODSP)                
  OBJS-$(CONFIG_BLOCKDSP)                += blockdsp.o
  OBJS-$(CONFIG_BSWAPDSP)                += bswapdsp.o
  OBJS-$(CONFIG_CABAC)                   += cabac.o
 +OBJS-$(CONFIG_CRYSTALHD)               += crystalhd.o
  OBJS-$(CONFIG_DCT)                     += dct.o dct32_fixed.o dct32_float.o
  OBJS-$(CONFIG_ERROR_RESILIENCE)        += error_resilience.o
 +OBJS-$(CONFIG_EXIF)                    += exif.o tiff_common.o
  OBJS-$(CONFIG_FAANDCT)                 += faandct.o
  OBJS-$(CONFIG_FAANIDCT)                += faanidct.o
  OBJS-$(CONFIG_FDCTDSP)                 += fdctdsp.o jfdctfst.o jfdctint.o
  FFT-OBJS-$(CONFIG_HARDCODED_TABLES)    += cos_tables.o cos_fixed_tables.o
  OBJS-$(CONFIG_FFT)                     += avfft.o fft_fixed.o fft_float.o \
 +                                          fft_fixed_32.o fft_init_table.o \
                                            $(FFT-OBJS-yes)
  OBJS-$(CONFIG_FLACDSP)                 += flacdsp.o
  OBJS-$(CONFIG_FMTCONVERT)              += fmtconvert.o
@@@ -84,21 -70,16 +85,21 @@@ OBJS-$(CONFIG_HUFFYUVDSP)              
  OBJS-$(CONFIG_HUFFYUVENCDSP)           += huffyuvencdsp.o
  OBJS-$(CONFIG_IDCTDSP)                 += idctdsp.o simple_idct.o jrevdct.o
  OBJS-$(CONFIG_IIRFILTER)               += iirfilter.o
 -OBJS-$(CONFIG_IMDCT15)                 += imdct15.o
 +OBJS-$(CONFIG_MDCT15)                  += mdct15.o
  OBJS-$(CONFIG_INTRAX8)                 += intrax8.o intrax8dsp.o
  OBJS-$(CONFIG_IVIDSP)                  += ivi_dsp.o
 +OBJS-$(CONFIG_JNI)                     += ffjni.o jni.o
  OBJS-$(CONFIG_JPEGTABLES)              += jpegtables.o
  OBJS-$(CONFIG_LIBXVID)                 += libxvid_rc.o
 +OBJS-$(CONFIG_LLAUDDSP)                += lossless_audiodsp.o
 +OBJS-$(CONFIG_LLVIDDSP)                += lossless_videodsp.o
 +OBJS-$(CONFIG_LLVIDENCDSP)             += lossless_videoencdsp.o
  OBJS-$(CONFIG_LPC)                     += lpc.o
  OBJS-$(CONFIG_LSP)                     += lsp.o
  OBJS-$(CONFIG_LZF)                     += lzf.o
 -OBJS-$(CONFIG_MDCT)                    += mdct_fixed.o mdct_float.o
 +OBJS-$(CONFIG_MDCT)                    += mdct_fixed.o mdct_float.o mdct_fixed_32.o
  OBJS-$(CONFIG_ME_CMP)                  += me_cmp.o
 +OBJS-$(CONFIG_MEDIACODEC)              += mediacodecdec_common.o mediacodec_surface.o mediacodec_wrapper.o mediacodec_sw_buffer.o
  OBJS-$(CONFIG_MPEG_ER)                 += mpeg_er.o
  OBJS-$(CONFIG_MPEGAUDIO)               += mpegaudio.o mpegaudiodata.o   \
                                            mpegaudiodecheader.o
@@@ -123,8 -104,7 +124,8 @@@ OBJS-$(CONFIG_RANGECODER)              
  RDFT-OBJS-$(CONFIG_HARDCODED_TABLES)   += sin_tables.o
  OBJS-$(CONFIG_RDFT)                    += rdft.o $(RDFT-OBJS-yes)
  OBJS-$(CONFIG_RV34DSP)                 += rv34dsp.o
 -OBJS-$(CONFIG_SINEWIN)                 += sinewin.o
 +OBJS-$(CONFIG_SHARED)                  += log2_tab.o reverse.o
 +OBJS-$(CONFIG_SINEWIN)                 += sinewin.o sinewin_fixed.o
  OBJS-$(CONFIG_SNAPPY)                  += snappy.o
  OBJS-$(CONFIG_STARTCODE)               += startcode.o
  OBJS-$(CONFIG_TEXTUREDSP)              += texturedsp.o
@@@ -140,34 -120,25 +141,34 @@@ OBJS-$(CONFIG_WMA_FREQS)               
  OBJS-$(CONFIG_WMV2DSP)                 += wmv2dsp.o
  
  # decoders/encoders
 +OBJS-$(CONFIG_ZERO12V_DECODER)         += 012v.o
  OBJS-$(CONFIG_A64MULTI_ENCODER)        += a64multienc.o elbg.o
  OBJS-$(CONFIG_A64MULTI5_ENCODER)       += a64multienc.o elbg.o
 -OBJS-$(CONFIG_AAC_DECODER)             += aacdec.o aactab.o aacsbr.o aacps.o \
 +OBJS-$(CONFIG_AAC_DECODER)             += aacdec.o aactab.o aacsbr.o aacps_float.o \
 +                                          aacadtsdec.o mpeg4audio.o kbdwin.o \
 +                                          sbrdsp.o aacpsdsp_float.o cbrt_data.o
 +OBJS-$(CONFIG_AAC_FIXED_DECODER)       += aacdec_fixed.o aactab.o aacsbr_fixed.o aacps_fixed.o \
                                            aacadtsdec.o mpeg4audio.o kbdwin.o \
 -                                          sbrdsp.o aacpsdsp.o
 -OBJS-$(CONFIG_AAC_ENCODER)             += aacenc.o aaccoder.o    \
 +                                          sbrdsp_fixed.o aacpsdsp_fixed.o cbrt_data_fixed.o
 +OBJS-$(CONFIG_AAC_ENCODER)             += aacenc.o aaccoder.o aacenctab.o    \
                                            aacpsy.o aactab.o      \
 -                                          psymodel.o mpeg4audio.o kbdwin.o
 +                                          aacenc_is.o \
 +                                          aacenc_tns.o \
 +                                          aacenc_ltp.o \
 +                                          aacenc_pred.o \
 +                                          psymodel.o mpeg4audio.o kbdwin.o cbrt_data.o
  OBJS-$(CONFIG_AASC_DECODER)            += aasc.o msrledec.o
 -OBJS-$(CONFIG_AC3_DECODER)             += ac3dec.o ac3dec_data.o ac3.o kbdwin.o
 +OBJS-$(CONFIG_AC3_DECODER)             += ac3dec_float.o ac3dec_data.o ac3.o kbdwin.o
 +OBJS-$(CONFIG_AC3_FIXED_DECODER)       += ac3dec_fixed.o ac3dec_data.o ac3.o kbdwin.o
  OBJS-$(CONFIG_AC3_ENCODER)             += ac3enc_float.o ac3enc.o ac3tab.o \
                                            ac3.o kbdwin.o
  OBJS-$(CONFIG_AC3_FIXED_ENCODER)       += ac3enc_fixed.o ac3enc.o ac3tab.o ac3.o
  OBJS-$(CONFIG_AIC_DECODER)             += aic.o
 -OBJS-$(CONFIG_ALAC_DECODER)            += alac.o alac_data.o
 +OBJS-$(CONFIG_ALAC_DECODER)            += alac.o alac_data.o alacdsp.o
  OBJS-$(CONFIG_ALAC_ENCODER)            += alacenc.o alac_data.o
  OBJS-$(CONFIG_ALIAS_PIX_DECODER)       += aliaspixdec.o
  OBJS-$(CONFIG_ALIAS_PIX_ENCODER)       += aliaspixenc.o
 -OBJS-$(CONFIG_ALS_DECODER)             += alsdec.o bgmc.o mpeg4audio.o
 +OBJS-$(CONFIG_ALS_DECODER)             += alsdec.o bgmc.o mlz.o mpeg4audio.o
  OBJS-$(CONFIG_AMRNB_DECODER)           += amrnbdec.o celp_filters.o   \
                                            celp_math.o acelp_filters.o \
                                            acelp_vectors.o             \
@@@ -176,15 -147,9 +177,15 @@@ OBJS-$(CONFIG_AMRWB_DECODER)           
                                            celp_math.o acelp_filters.o \
                                            acelp_vectors.o             \
                                            acelp_pitch_delay.o
 +OBJS-$(CONFIG_AMV_ENCODER)             += mjpegenc.o mjpegenc_common.o \
 +                                          mjpegenc_huffman.o
  OBJS-$(CONFIG_ANM_DECODER)             += anm.o
  OBJS-$(CONFIG_ANSI_DECODER)            += ansi.o cga_data.o
  OBJS-$(CONFIG_APE_DECODER)             += apedec.o
 +OBJS-$(CONFIG_APNG_DECODER)            += png.o pngdec.o pngdsp.o
 +OBJS-$(CONFIG_APNG_ENCODER)            += png.o pngenc.o
 +OBJS-$(CONFIG_SSA_DECODER)             += assdec.o ass.o
 +OBJS-$(CONFIG_SSA_ENCODER)             += assenc.o ass.o
  OBJS-$(CONFIG_ASS_DECODER)             += assdec.o ass.o
  OBJS-$(CONFIG_ASS_ENCODER)             += assenc.o ass.o
  OBJS-$(CONFIG_ASV1_DECODER)            += asvdec.o asv.o mpeg12data.o
@@@ -193,28 -158,16 +194,28 @@@ OBJS-$(CONFIG_ASV2_DECODER)            
  OBJS-$(CONFIG_ASV2_ENCODER)            += asvenc.o asv.o mpeg12data.o
  OBJS-$(CONFIG_ATRAC1_DECODER)          += atrac1.o atrac.o
  OBJS-$(CONFIG_ATRAC3_DECODER)          += atrac3.o atrac.o
 +OBJS-$(CONFIG_ATRAC3AL_DECODER)        += atrac3.o atrac.o
  OBJS-$(CONFIG_ATRAC3P_DECODER)         += atrac3plusdec.o atrac3plus.o \
                                            atrac3plusdsp.o atrac.o
 +OBJS-$(CONFIG_ATRAC3PAL_DECODER)       += atrac3plusdec.o atrac3plus.o \
 +                                          atrac3plusdsp.o atrac.o
  OBJS-$(CONFIG_AURA_DECODER)            += cyuv.o
  OBJS-$(CONFIG_AURA2_DECODER)           += aura.o
 +OBJS-$(CONFIG_AVRN_DECODER)            += avrndec.o mjpegdec.o
 +OBJS-$(CONFIG_AVRP_DECODER)            += r210dec.o
 +OBJS-$(CONFIG_AVRP_ENCODER)            += r210enc.o
  OBJS-$(CONFIG_AVS_DECODER)             += avs.o
 +OBJS-$(CONFIG_AVUI_DECODER)            += avuidec.o
 +OBJS-$(CONFIG_AVUI_ENCODER)            += avuienc.o
 +OBJS-$(CONFIG_AYUV_DECODER)            += v408dec.o
 +OBJS-$(CONFIG_AYUV_ENCODER)            += v408enc.o
  OBJS-$(CONFIG_BETHSOFTVID_DECODER)     += bethsoftvideo.o
  OBJS-$(CONFIG_BFI_DECODER)             += bfi.o
  OBJS-$(CONFIG_BINK_DECODER)            += bink.o binkdsp.o
  OBJS-$(CONFIG_BINKAUDIO_DCT_DECODER)   += binkaudio.o
  OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER)  += binkaudio.o
 +OBJS-$(CONFIG_BINTEXT_DECODER)         += bintext.o cga_data.o
 +OBJS-$(CONFIG_BITPACKED_DECODER)       += bitpacked.o
  OBJS-$(CONFIG_BMP_DECODER)             += bmp.o msrledec.o
  OBJS-$(CONFIG_BMP_ENCODER)             += bmpenc.o
  OBJS-$(CONFIG_BMV_AUDIO_DECODER)       += bmvaudio.o
@@@ -222,54 -175,40 +223,54 @@@ OBJS-$(CONFIG_BMV_VIDEO_DECODER)       
  OBJS-$(CONFIG_BRENDER_PIX_DECODER)     += brenderpix.o
  OBJS-$(CONFIG_C93_DECODER)             += c93.o
  OBJS-$(CONFIG_CAVS_DECODER)            += cavs.o cavsdec.o cavsdsp.o \
 -                                          cavsdata.o mpeg12data.o
 +                                          cavsdata.o
 +OBJS-$(CONFIG_CCAPTION_DECODER)        += ccaption_dec.o
  OBJS-$(CONFIG_CDGRAPHICS_DECODER)      += cdgraphics.o
  OBJS-$(CONFIG_CDXL_DECODER)            += cdxl.o
 +OBJS-$(CONFIG_CFHD_DECODER)            += cfhd.o cfhddata.o
  OBJS-$(CONFIG_CINEPAK_DECODER)         += cinepak.o
 +OBJS-$(CONFIG_CINEPAK_ENCODER)         += cinepakenc.o elbg.o
 +OBJS-$(CONFIG_CLEARVIDEO_DECODER)      += clearvideo.o
  OBJS-$(CONFIG_CLJR_DECODER)            += cljrdec.o
  OBJS-$(CONFIG_CLJR_ENCODER)            += cljrenc.o
  OBJS-$(CONFIG_CLLC_DECODER)            += cllc.o canopus.o
  OBJS-$(CONFIG_COMFORTNOISE_DECODER)    += cngdec.o celp_filters.o
  OBJS-$(CONFIG_COMFORTNOISE_ENCODER)    += cngenc.o
  OBJS-$(CONFIG_COOK_DECODER)            += cook.o
 +OBJS-$(CONFIG_CPIA_DECODER)            += cpia.o
  OBJS-$(CONFIG_CSCD_DECODER)            += cscd.o
  OBJS-$(CONFIG_CYUV_DECODER)            += cyuv.o
 -OBJS-$(CONFIG_DCA_DECODER)             += dcadec.o dca.o dcadsp.o      \
 -                                          dcadata.o dca_exss.o         \
 -                                          dca_xll.o synth_filter.o
 +OBJS-$(CONFIG_DCA_DECODER)             += dcadec.o dca.o dcadata.o dcahuff.o \
 +                                          dca_core.o dca_exss.o dca_xll.o dca_lbr.o \
 +                                          dcadsp.o dcadct.o synth_filter.o
 +OBJS-$(CONFIG_DCA_ENCODER)             += dcaenc.o dca.o dcadata.o dcahuff.o
  OBJS-$(CONFIG_DDS_DECODER)             += dds.o
 +OBJS-$(CONFIG_DIRAC_DECODER)           += diracdec.o dirac.o diracdsp.o diractab.o \
 +                                          dirac_arith.o dirac_dwt.o dirac_vlc.o
  OBJS-$(CONFIG_DFA_DECODER)             += dfa.o
  OBJS-$(CONFIG_DNXHD_DECODER)           += dnxhddec.o dnxhddata.o
  OBJS-$(CONFIG_DNXHD_ENCODER)           += dnxhdenc.o dnxhddata.o
  OBJS-$(CONFIG_DPX_DECODER)             += dpx.o
  OBJS-$(CONFIG_DPX_ENCODER)             += dpxenc.o
 +OBJS-$(CONFIG_DSD_LSBF_DECODER)        += dsddec.o dsd.o
 +OBJS-$(CONFIG_DSD_MSBF_DECODER)        += dsddec.o dsd.o
 +OBJS-$(CONFIG_DSD_LSBF_PLANAR_DECODER) += dsddec.o dsd.o
 +OBJS-$(CONFIG_DSD_MSBF_PLANAR_DECODER) += dsddec.o dsd.o
  OBJS-$(CONFIG_DSICINAUDIO_DECODER)     += dsicinaudio.o
  OBJS-$(CONFIG_DSICINVIDEO_DECODER)     += dsicinvideo.o
  OBJS-$(CONFIG_DSS_SP_DECODER)          += dss_sp.o
 +OBJS-$(CONFIG_DST_DECODER)             += dstdec.o dsd.o
  OBJS-$(CONFIG_DVBSUB_DECODER)          += dvbsubdec.o
  OBJS-$(CONFIG_DVBSUB_ENCODER)          += dvbsub.o
  OBJS-$(CONFIG_DVDSUB_DECODER)          += dvdsubdec.o
  OBJS-$(CONFIG_DVDSUB_ENCODER)          += dvdsubenc.o
 +OBJS-$(CONFIG_DVAUDIO_DECODER)         += dvaudiodec.o
  OBJS-$(CONFIG_DVVIDEO_DECODER)         += dvdec.o dv.o dvdata.o
  OBJS-$(CONFIG_DVVIDEO_ENCODER)         += dvenc.o dv.o dvdata.o
  OBJS-$(CONFIG_DXA_DECODER)             += dxa.o
  OBJS-$(CONFIG_DXTORY_DECODER)          += dxtory.o
  OBJS-$(CONFIG_DXV_DECODER)             += dxv.o
 -OBJS-$(CONFIG_EAC3_DECODER)            += eac3dec.o eac3_data.o
 +OBJS-$(CONFIG_EAC3_DECODER)            += eac3_data.o
  OBJS-$(CONFIG_EAC3_ENCODER)            += eac3enc.o eac3_data.o
  OBJS-$(CONFIG_EACMV_DECODER)           += eacmv.o
  OBJS-$(CONFIG_EAMAD_DECODER)           += eamad.o eaidct.o mpeg12.o \
@@@ -282,29 -221,26 +283,29 @@@ OBJS-$(CONFIG_EIGHTSVX_EXP_DECODER)    
  OBJS-$(CONFIG_EIGHTSVX_FIB_DECODER)    += 8svx.o
  OBJS-$(CONFIG_ESCAPE124_DECODER)       += escape124.o
  OBJS-$(CONFIG_ESCAPE130_DECODER)       += escape130.o
 +OBJS-$(CONFIG_EVRC_DECODER)            += evrcdec.o acelp_vectors.o lsp.o
  OBJS-$(CONFIG_EXR_DECODER)             += exr.o
  OBJS-$(CONFIG_FFV1_DECODER)            += ffv1dec.o ffv1.o
  OBJS-$(CONFIG_FFV1_ENCODER)            += ffv1enc.o ffv1.o
 +OBJS-$(CONFIG_FFWAVESYNTH_DECODER)     += ffwavesynth.o
  OBJS-$(CONFIG_FIC_DECODER)             += fic.o
  OBJS-$(CONFIG_FLAC_DECODER)            += flacdec.o flacdata.o flac.o
 -OBJS-$(CONFIG_FLAC_ENCODER)            += flacenc.o flacdata.o flac.o
 +OBJS-$(CONFIG_FLAC_ENCODER)            += flacenc.o flacdata.o flac.o vorbis_data.o
  OBJS-$(CONFIG_FLASHSV_DECODER)         += flashsv.o
  OBJS-$(CONFIG_FLASHSV_ENCODER)         += flashsvenc.o
 +OBJS-$(CONFIG_FLASHSV2_ENCODER)        += flashsv2enc.o
  OBJS-$(CONFIG_FLASHSV2_DECODER)        += flashsv.o
  OBJS-$(CONFIG_FLIC_DECODER)            += flicvideo.o
 +OBJS-$(CONFIG_FMVC_DECODER)            += fmvc.o
  OBJS-$(CONFIG_FOURXM_DECODER)          += 4xm.o
  OBJS-$(CONFIG_FRAPS_DECODER)           += fraps.o
  OBJS-$(CONFIG_FRWU_DECODER)            += frwu.o
  OBJS-$(CONFIG_G2M_DECODER)             += g2meet.o elsdec.o
  OBJS-$(CONFIG_G723_1_DECODER)          += g723_1dec.o g723_1.o \
 -                                          acelp_vectors.o celp_filters.o \
 -                                          celp_math.o
 +                                          acelp_vectors.o celp_filters.o celp_math.o
  OBJS-$(CONFIG_G723_1_ENCODER)          += g723_1enc.o g723_1.o \
 -                                          acelp_vectors.o celp_filters.o \
 -                                          celp_math.o
 +                                          acelp_vectors.o celp_filters.o celp_math.o
 +OBJS-$(CONFIG_G729_DECODER)            += g729dec.o lsp.o celp_math.o celp_filters.o acelp_filters.o acelp_pitch_delay.o acelp_vectors.o g729postfilter.o
  OBJS-$(CONFIG_GIF_DECODER)             += gifdec.o lzw.o
  OBJS-$(CONFIG_GIF_ENCODER)             += gif.o lzwenc.o
  OBJS-$(CONFIG_GSM_DECODER)             += gsmdec.o gsmdec_data.o msgsmdec.o
@@@ -321,27 -257,18 +322,27 @@@ OBJS-$(CONFIG_H264_DECODER)            
                                            h264_mb.o h264_picture.o \
                                            h264_refs.o h264_sei.o \
                                            h264_slice.o h264data.o
 +OBJS-$(CONFIG_H264_CUVID_DECODER)      += cuvid.o
 +OBJS-$(CONFIG_H264_MEDIACODEC_DECODER) += mediacodecdec.o
  OBJS-$(CONFIG_H264_MMAL_DECODER)       += mmaldec.o
  OBJS-$(CONFIG_H264_NVENC_ENCODER)      += nvenc_h264.o
 +OBJS-$(CONFIG_NVENC_ENCODER)           += nvenc_h264.o
 +OBJS-$(CONFIG_NVENC_H264_ENCODER)      += nvenc_h264.o
 +OBJS-$(CONFIG_H264_VDA_DECODER)        += vda_h264_dec.o
  OBJS-$(CONFIG_H264_OMX_ENCODER)        += omx.o
  OBJS-$(CONFIG_H264_QSV_DECODER)        += qsvdec_h2645.o
  OBJS-$(CONFIG_H264_QSV_ENCODER)        += qsvenc_h264.o
  OBJS-$(CONFIG_H264_VAAPI_ENCODER)      += vaapi_encode_h264.o vaapi_encode_h26x.o
 +OBJS-$(CONFIG_H264_VIDEOTOOLBOX_ENCODER) += videotoolboxenc.o
  OBJS-$(CONFIG_HAP_DECODER)             += hapdec.o hap.o
  OBJS-$(CONFIG_HAP_ENCODER)             += hapenc.o hap.o
  OBJS-$(CONFIG_HEVC_DECODER)            += hevcdec.o hevc_mvs.o hevc_ps.o hevc_sei.o \
                                            hevc_cabac.o hevc_refs.o hevcpred.o    \
                                            hevcdsp.o hevc_filter.o h2645_parse.o hevc_data.o
 +OBJS-$(CONFIG_HEVC_CUVID_DECODER)      += cuvid.o
 +OBJS-$(CONFIG_HEVC_MEDIACODEC_DECODER) += mediacodecdec.o hevc_parse.o
  OBJS-$(CONFIG_HEVC_NVENC_ENCODER)      += nvenc_hevc.o
 +OBJS-$(CONFIG_NVENC_HEVC_ENCODER)      += nvenc_hevc.o
  OBJS-$(CONFIG_HEVC_QSV_DECODER)        += qsvdec_h2645.o
  OBJS-$(CONFIG_HEVC_QSV_ENCODER)        += qsvenc_hevc.o hevc_ps_enc.o h2645_parse.o
  OBJS-$(CONFIG_HEVC_VAAPI_ENCODER)      += vaapi_encode_h265.o vaapi_encode_h26x.o
@@@ -352,19 -279,15 +353,19 @@@ OBJS-$(CONFIG_HQX_DECODER)             
  OBJS-$(CONFIG_HUFFYUV_DECODER)         += huffyuv.o huffyuvdec.o
  OBJS-$(CONFIG_HUFFYUV_ENCODER)         += huffyuv.o huffyuvenc.o
  OBJS-$(CONFIG_IDCIN_DECODER)           += idcinvideo.o
 -OBJS-$(CONFIG_IFF_BYTERUN1_DECODER)    += iff.o
 +OBJS-$(CONFIG_IDF_DECODER)             += bintext.o cga_data.o
  OBJS-$(CONFIG_IFF_ILBM_DECODER)        += iff.o
  OBJS-$(CONFIG_IMC_DECODER)             += imc.o
  OBJS-$(CONFIG_INDEO2_DECODER)          += indeo2.o
  OBJS-$(CONFIG_INDEO3_DECODER)          += indeo3.o
  OBJS-$(CONFIG_INDEO4_DECODER)          += indeo4.o ivi.o
  OBJS-$(CONFIG_INDEO5_DECODER)          += indeo5.o ivi.o
 +OBJS-$(CONFIG_INTERPLAY_ACM_DECODER)   += interplayacm.o
  OBJS-$(CONFIG_INTERPLAY_DPCM_DECODER)  += dpcm.o
  OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o
 +OBJS-$(CONFIG_JACOSUB_DECODER)         += jacosubdec.o ass.o
 +OBJS-$(CONFIG_JPEG2000_ENCODER)        += j2kenc.o mqcenc.o mqc.o jpeg2000.o \
 +                                          jpeg2000dwt.o
  OBJS-$(CONFIG_JPEG2000_DECODER)        += jpeg2000dec.o jpeg2000.o jpeg2000dsp.o \
                                            jpeg2000dwt.o mqcdec.o mqc.o
  OBJS-$(CONFIG_JPEGLS_DECODER)          += jpeglsdec.o jpegls.o
@@@ -375,32 -298,24 +376,32 @@@ OBJS-$(CONFIG_KMVC_DECODER)            
  OBJS-$(CONFIG_LAGARITH_DECODER)        += lagarith.o lagarithrac.o
  OBJS-$(CONFIG_LJPEG_ENCODER)           += ljpegenc.o mjpegenc_common.o
  OBJS-$(CONFIG_LOCO_DECODER)            += loco.o
 +OBJS-$(CONFIG_M101_DECODER)            += m101.o
  OBJS-$(CONFIG_MACE3_DECODER)           += mace.o
  OBJS-$(CONFIG_MACE6_DECODER)           += mace.o
  OBJS-$(CONFIG_MAGICYUV_DECODER)        += magicyuv.o
  OBJS-$(CONFIG_MDEC_DECODER)            += mdec.o mpeg12.o mpeg12data.o
  OBJS-$(CONFIG_METASOUND_DECODER)       += metasound.o metasound_data.o \
                                            twinvq.o
 +OBJS-$(CONFIG_MICRODVD_DECODER)        += microdvddec.o ass.o
  OBJS-$(CONFIG_MIMIC_DECODER)           += mimic.o
  OBJS-$(CONFIG_MJPEG_DECODER)           += mjpegdec.o
 -OBJS-$(CONFIG_MJPEG_ENCODER)           += mjpegenc.o mjpegenc_common.o
 +OBJS-$(CONFIG_MJPEG_ENCODER)           += mjpegenc.o mjpegenc_common.o \
 +                                          mjpegenc_huffman.o
  OBJS-$(CONFIG_MJPEGB_DECODER)          += mjpegbdec.o
  OBJS-$(CONFIG_MJPEG_VAAPI_ENCODER)     += vaapi_encode_mjpeg.o
  OBJS-$(CONFIG_MLP_DECODER)             += mlpdec.o mlpdsp.o
 +OBJS-$(CONFIG_MLP_ENCODER)             += mlpenc.o mlp.o
  OBJS-$(CONFIG_MMVIDEO_DECODER)         += mmvideo.o
  OBJS-$(CONFIG_MOTIONPIXELS_DECODER)    += motionpixels.o
 +OBJS-$(CONFIG_MOVTEXT_DECODER)         += movtextdec.o ass.o
 +OBJS-$(CONFIG_MOVTEXT_ENCODER)         += movtextenc.o ass_split.o
  OBJS-$(CONFIG_MP1_DECODER)             += mpegaudiodec_fixed.o
  OBJS-$(CONFIG_MP1FLOAT_DECODER)        += mpegaudiodec_float.o
  OBJS-$(CONFIG_MP2_DECODER)             += mpegaudiodec_fixed.o
 -OBJS-$(CONFIG_MP2_ENCODER)             += mpegaudioenc.o mpegaudio.o \
 +OBJS-$(CONFIG_MP2_ENCODER)             += mpegaudioenc_float.o mpegaudio.o \
 +                                          mpegaudiodata.o mpegaudiodsp_data.o
 +OBJS-$(CONFIG_MP2FIXED_ENCODER)        += mpegaudioenc_fixed.o mpegaudio.o \
                                            mpegaudiodata.o mpegaudiodsp_data.o
  OBJS-$(CONFIG_MP2FLOAT_DECODER)        += mpegaudiodec_float.o
  OBJS-$(CONFIG_MP3_DECODER)             += mpegaudiodec_fixed.o
@@@ -411,19 -326,16 +412,19 @@@ OBJS-$(CONFIG_MP3ON4_DECODER)          
  OBJS-$(CONFIG_MP3ON4FLOAT_DECODER)     += mpegaudiodec_float.o mpeg4audio.o
  OBJS-$(CONFIG_MPC7_DECODER)            += mpc7.o mpc.o
  OBJS-$(CONFIG_MPC8_DECODER)            += mpc8.o mpc.o
 -OBJS-$(CONFIG_MPEG_XVMC_DECODER)       += mpegvideo_xvmc.o
 +OBJS-$(CONFIG_MPEGVIDEO_DECODER)       += mpeg12dec.o mpeg12.o mpeg12data.o
  OBJS-$(CONFIG_MPEG1VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
  OBJS-$(CONFIG_MPEG1VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
 +OBJS-$(CONFIG_MPEG2_MMAL_DECODER)      += mmaldec.o
  OBJS-$(CONFIG_MPEG2_QSV_DECODER)       += qsvdec_other.o
  OBJS-$(CONFIG_MPEG2_QSV_ENCODER)       += qsvenc_mpeg2.o
  OBJS-$(CONFIG_MPEG2VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
  OBJS-$(CONFIG_MPEG2VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
 -OBJS-$(CONFIG_MPEG2_MMAL_DECODER)      += mmaldec.o
 +OBJS-$(CONFIG_MPEG2_VAAPI_ENCODER)     += vaapi_encode_mpeg2.o
  OBJS-$(CONFIG_MPEG4_DECODER)           += xvididct.o
 +OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec.o
  OBJS-$(CONFIG_MPEG4_OMX_ENCODER)       += omx.o
 +OBJS-$(CONFIG_MPL2_DECODER)            += mpl2dec.o ass.o
  OBJS-$(CONFIG_MSA1_DECODER)            += mss3.o
  OBJS-$(CONFIG_MSMPEG4V1_DECODER)       += msmpeg4dec.o msmpeg4.o msmpeg4data.o
  OBJS-$(CONFIG_MSMPEG4V2_DECODER)       += msmpeg4dec.o msmpeg4.o msmpeg4data.o
@@@ -434,7 -346,6 +435,7 @@@ OBJS-$(CONFIG_MSRLE_DECODER)           
  OBJS-$(CONFIG_MSS1_DECODER)            += mss1.o mss12.o
  OBJS-$(CONFIG_MSS2_DECODER)            += mss2.o mss12.o mss2dsp.o wmv2data.o
  OBJS-$(CONFIG_MSVIDEO1_DECODER)        += msvideo1.o
 +OBJS-$(CONFIG_MSVIDEO1_ENCODER)        += msvideo1enc.o elbg.o
  OBJS-$(CONFIG_MSZH_DECODER)            += lcldec.o
  OBJS-$(CONFIG_MTS2_DECODER)            += mss4.o
  OBJS-$(CONFIG_MVC1_DECODER)            += mvcdec.o
@@@ -444,9 -355,8 +445,9 @@@ OBJS-$(CONFIG_NELLYMOSER_DECODER)      
  OBJS-$(CONFIG_NELLYMOSER_ENCODER)      += nellymoserenc.o nellymoser.o
  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_silk.o vorbis_data.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_PAF_AUDIO_DECODER)       += pafaudio.o
  OBJS-$(CONFIG_PAF_VIDEO_DECODER)       += pafvideo.o
  OBJS-$(CONFIG_PAM_DECODER)             += pnmdec.o pnm.o
@@@ -461,39 -371,29 +462,39 @@@ OBJS-$(CONFIG_PGMYUV_DECODER)          
  OBJS-$(CONFIG_PGMYUV_ENCODER)          += pnmenc.o
  OBJS-$(CONFIG_PGSSUB_DECODER)          += pgssubdec.o
  OBJS-$(CONFIG_PICTOR_DECODER)          += pictordec.o cga_data.o
 +OBJS-$(CONFIG_PIXLET_DECODER)          += pixlet.o
 +OBJS-$(CONFIG_PJS_DECODER)             += textdec.o ass.o
  OBJS-$(CONFIG_PNG_DECODER)             += png.o pngdec.o pngdsp.o
  OBJS-$(CONFIG_PNG_ENCODER)             += png.o pngenc.o
  OBJS-$(CONFIG_PPM_DECODER)             += pnmdec.o pnm.o
  OBJS-$(CONFIG_PPM_ENCODER)             += pnmenc.o
 -OBJS-$(CONFIG_PRORES_DECODER)          += proresdec.o proresdata.o proresdsp.o
 -OBJS-$(CONFIG_PRORES_ENCODER)          += proresenc.o proresdata.o
 +OBJS-$(CONFIG_PRORES_DECODER)          += proresdec2.o proresdsp.o proresdata.o
 +OBJS-$(CONFIG_PRORES_LGPL_DECODER)     += proresdec_lgpl.o proresdsp.o proresdata.o
 +OBJS-$(CONFIG_PRORES_ENCODER)          += proresenc_anatoliy.o
 +OBJS-$(CONFIG_PRORES_AW_ENCODER)       += proresenc_anatoliy.o
 +OBJS-$(CONFIG_PRORES_KS_ENCODER)       += proresenc_kostya.o proresdata.o
 +OBJS-$(CONFIG_PSD_DECODER)             += psd.o
  OBJS-$(CONFIG_PTX_DECODER)             += ptx.o
  OBJS-$(CONFIG_QCELP_DECODER)           += qcelpdec.o                     \
                                            celp_filters.o acelp_vectors.o \
                                            acelp_filters.o
  OBJS-$(CONFIG_QDM2_DECODER)            += qdm2.o
 +OBJS-$(CONFIG_QDMC_DECODER)            += qdmc.o
  OBJS-$(CONFIG_QDRAW_DECODER)           += qdrw.o
  OBJS-$(CONFIG_QPEG_DECODER)            += qpeg.o
  OBJS-$(CONFIG_QTRLE_DECODER)           += qtrle.o
  OBJS-$(CONFIG_QTRLE_ENCODER)           += qtrleenc.o
  OBJS-$(CONFIG_R10K_DECODER)            += r210dec.o
 +OBJS-$(CONFIG_R10K_ENCODER)            += r210enc.o
  OBJS-$(CONFIG_R210_DECODER)            += r210dec.o
 +OBJS-$(CONFIG_R210_ENCODER)            += r210enc.o
  OBJS-$(CONFIG_RA_144_DECODER)          += ra144dec.o ra144.o celp_filters.o
  OBJS-$(CONFIG_RA_144_ENCODER)          += ra144enc.o ra144.o celp_filters.o
  OBJS-$(CONFIG_RA_288_DECODER)          += ra288.o celp_filters.o
  OBJS-$(CONFIG_RALF_DECODER)            += ralf.o
  OBJS-$(CONFIG_RAWVIDEO_DECODER)        += rawdec.o
  OBJS-$(CONFIG_RAWVIDEO_ENCODER)        += rawenc.o
 +OBJS-$(CONFIG_REALTEXT_DECODER)        += realtextdec.o ass.o
  OBJS-$(CONFIG_RL2_DECODER)             += rl2.o
  OBJS-$(CONFIG_ROQ_DECODER)             += roqvideodec.o roqvideo.o
  OBJS-$(CONFIG_ROQ_ENCODER)             += roqvideoenc.o roqvideo.o elbg.o
@@@ -507,17 -407,12 +508,17 @@@ OBJS-$(CONFIG_RV20_DECODER)            
  OBJS-$(CONFIG_RV20_ENCODER)            += rv20enc.o
  OBJS-$(CONFIG_RV30_DECODER)            += rv30.o rv34.o rv30dsp.o
  OBJS-$(CONFIG_RV40_DECODER)            += rv40.o rv34.o rv40dsp.o
 +OBJS-$(CONFIG_SAMI_DECODER)            += samidec.o ass.o htmlsubtitles.o
  OBJS-$(CONFIG_S302M_DECODER)           += s302m.o
 +OBJS-$(CONFIG_S302M_ENCODER)           += s302menc.o
  OBJS-$(CONFIG_SANM_DECODER)            += sanm.o
 +OBJS-$(CONFIG_SCPR_DECODER)            += scpr.o
  OBJS-$(CONFIG_SCREENPRESSO_DECODER)    += screenpresso.o
 +OBJS-$(CONFIG_SDX2_DPCM_DECODER)       += dpcm.o
  OBJS-$(CONFIG_SGI_DECODER)             += sgidec.o
  OBJS-$(CONFIG_SGI_ENCODER)             += sgienc.o rle.o
  OBJS-$(CONFIG_SGIRLE_DECODER)          += sgirledec.o
 +OBJS-$(CONFIG_SHEERVIDEO_DECODER)      += sheervideo.o
  OBJS-$(CONFIG_SHORTEN_DECODER)         += shorten.o
  OBJS-$(CONFIG_SIPR_DECODER)            += sipr.o acelp_pitch_delay.o \
                                            celp_math.o acelp_vectors.o \
  OBJS-$(CONFIG_SMACKAUD_DECODER)        += smacker.o
  OBJS-$(CONFIG_SMACKER_DECODER)         += smacker.o
  OBJS-$(CONFIG_SMC_DECODER)             += smc.o
 +OBJS-$(CONFIG_SMVJPEG_DECODER)         += smvjpegdec.o
 +OBJS-$(CONFIG_SNOW_DECODER)            += snowdec.o snow.o snow_dwt.o
 +OBJS-$(CONFIG_SNOW_ENCODER)            += snowenc.o snow.o snow_dwt.o             \
 +                                          h263.o ituh263enc.o
  OBJS-$(CONFIG_SOL_DPCM_DECODER)        += dpcm.o
 +OBJS-$(CONFIG_SONIC_DECODER)           += sonic.o
 +OBJS-$(CONFIG_SONIC_ENCODER)           += sonic.o
 +OBJS-$(CONFIG_SONIC_LS_ENCODER)        += sonic.o
 +OBJS-$(CONFIG_SPEEDHQ_DECODER)         += speedhq.o simple_idct.o
  OBJS-$(CONFIG_SP5X_DECODER)            += sp5xdec.o
 -OBJS-$(CONFIG_SRT_DECODER)             += srtdec.o ass.o
 +OBJS-$(CONFIG_SRT_DECODER)             += srtdec.o ass.o htmlsubtitles.o
 +OBJS-$(CONFIG_SRT_ENCODER)             += srtenc.o ass_split.o
 +OBJS-$(CONFIG_STL_DECODER)             += textdec.o ass.o
 +OBJS-$(CONFIG_SUBRIP_DECODER)          += srtdec.o ass.o htmlsubtitles.o
 +OBJS-$(CONFIG_SUBRIP_ENCODER)          += srtenc.o ass_split.o
 +OBJS-$(CONFIG_SUBVIEWER1_DECODER)      += textdec.o ass.o
 +OBJS-$(CONFIG_SUBVIEWER_DECODER)       += subviewerdec.o ass.o
  OBJS-$(CONFIG_SUNRAST_DECODER)         += sunrast.o
  OBJS-$(CONFIG_SUNRAST_ENCODER)         += sunrastenc.o
  OBJS-$(CONFIG_SVQ1_DECODER)            += svq1dec.o svq1.o svq13.o h263data.o
  OBJS-$(CONFIG_SVQ1_ENCODER)            += svq1enc.o svq1.o  h263data.o  \
                                            h263.o ituh263enc.o
  OBJS-$(CONFIG_SVQ3_DECODER)            += svq3.o svq13.o mpegutils.o h264data.o
 -OBJS-$(CONFIG_TAK_DECODER)             += takdec.o tak.o
 +OBJS-$(CONFIG_TEXT_DECODER)            += textdec.o ass.o
 +OBJS-$(CONFIG_TEXT_ENCODER)            += srtenc.o ass_split.o
 +OBJS-$(CONFIG_TAK_DECODER)             += takdec.o tak.o takdsp.o
  OBJS-$(CONFIG_TARGA_DECODER)           += targa.o
  OBJS-$(CONFIG_TARGA_ENCODER)           += targaenc.o rle.o
 +OBJS-$(CONFIG_TARGA_Y216_DECODER)      += targa_y216dec.o
  OBJS-$(CONFIG_TDSC_DECODER)            += tdsc.o
  OBJS-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.o
 -OBJS-$(CONFIG_TIFF_DECODER)            += tiff.o lzw.o faxcompr.o
 -OBJS-$(CONFIG_TIFF_ENCODER)            += tiffenc.o rle.o lzwenc.o
 +OBJS-$(CONFIG_TIFF_DECODER)            += tiff.o lzw.o faxcompr.o tiff_data.o tiff_common.o
 +OBJS-$(CONFIG_TIFF_ENCODER)            += tiffenc.o rle.o lzwenc.o tiff_data.o
  OBJS-$(CONFIG_TMV_DECODER)             += tmv.o cga_data.o
 +OBJS-$(CONFIG_TRUEHD_DECODER)          += mlpdec.o mlpdsp.o
 +OBJS-$(CONFIG_TRUEHD_ENCODER)          += mlpenc.o mlp.o
  OBJS-$(CONFIG_TRUEMOTION1_DECODER)     += truemotion1.o
  OBJS-$(CONFIG_TRUEMOTION2_DECODER)     += truemotion2.o
  OBJS-$(CONFIG_TRUEMOTION2RT_DECODER)   += truemotion2rt.o
  OBJS-$(CONFIG_TRUESPEECH_DECODER)      += truespeech.o
  OBJS-$(CONFIG_TSCC_DECODER)            += tscc.o msrledec.o
  OBJS-$(CONFIG_TSCC2_DECODER)           += tscc2.o
 -OBJS-$(CONFIG_TTA_DECODER)             += tta.o
 +OBJS-$(CONFIG_TTA_DECODER)             += tta.o ttadata.o ttadsp.o
 +OBJS-$(CONFIG_TTA_ENCODER)             += ttaenc.o ttaencdsp.o ttadata.o
  OBJS-$(CONFIG_TWINVQ_DECODER)          += twinvqdec.o twinvq.o
  OBJS-$(CONFIG_TXD_DECODER)             += txd.o
  OBJS-$(CONFIG_ULTI_DECODER)            += ulti.o
@@@ -578,10 -453,6 +579,10 @@@ OBJS-$(CONFIG_UTVIDEO_ENCODER)         
  OBJS-$(CONFIG_V210_DECODER)            += v210dec.o
  OBJS-$(CONFIG_V210_ENCODER)            += v210enc.o
  OBJS-$(CONFIG_V210X_DECODER)           += v210x.o
 +OBJS-$(CONFIG_V308_DECODER)            += v308dec.o
 +OBJS-$(CONFIG_V308_ENCODER)            += v308enc.o
 +OBJS-$(CONFIG_V408_DECODER)            += v408dec.o
 +OBJS-$(CONFIG_V408_ENCODER)            += v408enc.o
  OBJS-$(CONFIG_V410_DECODER)            += v410dec.o
  OBJS-$(CONFIG_V410_ENCODER)            += v410enc.o
  OBJS-$(CONFIG_VB_DECODER)              += vb.o
@@@ -589,11 -460,9 +590,11 @@@ OBJS-$(CONFIG_VBLE_DECODER)            
  OBJS-$(CONFIG_VC1_DECODER)             += vc1dec.o vc1_block.o vc1_loopfilter.o \
                                            vc1_mc.o vc1_pred.o vc1.o vc1data.o \
                                            msmpeg4dec.o msmpeg4.o msmpeg4data.o \
 -                                          wmv2data.o
 +                                          wmv2dsp.o wmv2data.o
 +OBJS-$(CONFIG_VC1_CUVID_DECODER)       += cuvid.o
  OBJS-$(CONFIG_VC1_MMAL_DECODER)        += mmaldec.o
  OBJS-$(CONFIG_VC1_QSV_DECODER)         += qsvdec_other.o
 +OBJS-$(CONFIG_VC2_ENCODER)             += vc2enc.o vc2enc_dwt.o diractab.o
  OBJS-$(CONFIG_VCR1_DECODER)            += vcr1.o
  OBJS-$(CONFIG_VMDAUDIO_DECODER)        += vmdaudio.o
  OBJS-$(CONFIG_VMDVIDEO_DECODER)        += vmdvideo.o
@@@ -608,22 -477,12 +609,22 @@@ OBJS-$(CONFIG_VP6_DECODER)             
                                            vp6dsp.o vp56rac.o
  OBJS-$(CONFIG_VP7_DECODER)             += vp8.o vp56rac.o
  OBJS-$(CONFIG_VP8_DECODER)             += vp8.o vp56rac.o
 +OBJS-$(CONFIG_VP8_CUVID_DECODER)       += cuvid.o
 +OBJS-$(CONFIG_VP8_MEDIACODEC_DECODER)  += mediacodecdec.o
  OBJS-$(CONFIG_VP8_QSV_DECODER)         += qsvdec_other.o
 -OBJS-$(CONFIG_VP9_DECODER)             += vp9.o vp9data.o vp9dsp.o \
 -                                          vp9block.o vp9prob.o vp9mvs.o vp56rac.o
 +OBJS-$(CONFIG_VP8_VAAPI_ENCODER)       += vaapi_encode_vp8.o
 +OBJS-$(CONFIG_VP9_DECODER)             += vp9.o vp9data.o vp9dsp.o vp9lpf.o vp9recon.o \
 +                                          vp9block.o vp9prob.o vp9mvs.o vp56rac.o \
 +                                          vp9dsp_8bpp.o vp9dsp_10bpp.o vp9dsp_12bpp.o
 +OBJS-$(CONFIG_VP9_CUVID_DECODER)       += cuvid.o
 +OBJS-$(CONFIG_VP9_MEDIACODEC_DECODER)  += mediacodecdec.o
 +OBJS-$(CONFIG_VPLAYER_DECODER)         += textdec.o ass.o
  OBJS-$(CONFIG_VQA_DECODER)             += vqavideo.o
  OBJS-$(CONFIG_WAVPACK_DECODER)         += wavpack.o
 +OBJS-$(CONFIG_WAVPACK_ENCODER)         += wavpackenc.o
  OBJS-$(CONFIG_WEBP_DECODER)            += webp.o
 +OBJS-$(CONFIG_WEBVTT_DECODER)          += webvttdec.o ass.o
 +OBJS-$(CONFIG_WEBVTT_ENCODER)          += webvttenc.o ass_split.o
  OBJS-$(CONFIG_WMALOSSLESS_DECODER)     += wmalosslessdec.o wma_common.o
  OBJS-$(CONFIG_WMAPRO_DECODER)          += wmaprodec.o wma.o wma_common.o
  OBJS-$(CONFIG_WMAV1_DECODER)           += wmadec.o wma.o wma_common.o aactab.o
@@@ -634,7 -493,6 +635,7 @@@ OBJS-$(CONFIG_WMAVOICE_DECODER)        
                                            celp_filters.o \
                                            acelp_vectors.o acelp_filters.o
  OBJS-$(CONFIG_WMV1_DECODER)            += msmpeg4dec.o msmpeg4.o msmpeg4data.o
 +OBJS-$(CONFIG_WMV1_ENCODER)            += msmpeg4enc.o
  OBJS-$(CONFIG_WMV2_DECODER)            += wmv2dec.o wmv2.o wmv2data.o \
                                            msmpeg4dec.o msmpeg4.o msmpeg4data.o
  OBJS-$(CONFIG_WMV2_ENCODER)            += wmv2enc.o wmv2.o wmv2data.o \
@@@ -645,25 -503,14 +646,25 @@@ OBJS-$(CONFIG_WS_SND1_DECODER)         
  OBJS-$(CONFIG_XAN_DPCM_DECODER)        += dpcm.o
  OBJS-$(CONFIG_XAN_WC3_DECODER)         += xan.o
  OBJS-$(CONFIG_XAN_WC4_DECODER)         += xxan.o
 +OBJS-$(CONFIG_XBIN_DECODER)            += bintext.o cga_data.o
  OBJS-$(CONFIG_XBM_DECODER)             += xbmdec.o
  OBJS-$(CONFIG_XBM_ENCODER)             += xbmenc.o
 +OBJS-$(CONFIG_XFACE_DECODER)           += xfacedec.o xface.o
 +OBJS-$(CONFIG_XFACE_ENCODER)           += xfaceenc.o xface.o
  OBJS-$(CONFIG_XL_DECODER)              += xl.o
 +OBJS-$(CONFIG_XMA1_DECODER)            += wmaprodec.o wma.o wma_common.o
 +OBJS-$(CONFIG_XMA2_DECODER)            += wmaprodec.o wma.o wma_common.o
 +OBJS-$(CONFIG_XPM_DECODER)             += xpmdec.o
  OBJS-$(CONFIG_XSUB_DECODER)            += xsubdec.o
  OBJS-$(CONFIG_XSUB_ENCODER)            += xsubenc.o
  OBJS-$(CONFIG_XWD_DECODER)             += xwddec.o
  OBJS-$(CONFIG_XWD_ENCODER)             += xwdenc.o
 +OBJS-$(CONFIG_Y41P_DECODER)            += y41pdec.o
 +OBJS-$(CONFIG_Y41P_ENCODER)            += y41penc.o
 +OBJS-$(CONFIG_YLC_DECODER)             += ylc.o
  OBJS-$(CONFIG_YOP_DECODER)             += yop.o
 +OBJS-$(CONFIG_YUV4_DECODER)            += yuv4dec.o
 +OBJS-$(CONFIG_YUV4_ENCODER)            += yuv4enc.o
  OBJS-$(CONFIG_ZEROCODEC_DECODER)       += zerocodec.o
  OBJS-$(CONFIG_ZLIB_DECODER)            += lcldec.o
  OBJS-$(CONFIG_ZLIB_ENCODER)            += lclenc.o
@@@ -675,8 -522,6 +676,8 @@@ OBJS-$(CONFIG_PCM_ALAW_DECODER
  OBJS-$(CONFIG_PCM_ALAW_ENCODER)           += pcm.o
  OBJS-$(CONFIG_PCM_BLURAY_DECODER)         += pcm-bluray.o
  OBJS-$(CONFIG_PCM_DVD_DECODER)            += pcm-dvd.o
 +OBJS-$(CONFIG_PCM_F16LE_DECODER)          += pcm.o
 +OBJS-$(CONFIG_PCM_F24LE_DECODER)          += pcm.o
  OBJS-$(CONFIG_PCM_F32BE_DECODER)          += pcm.o
  OBJS-$(CONFIG_PCM_F32BE_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_F32LE_DECODER)          += pcm.o
@@@ -690,16 -535,13 +691,16 @@@ OBJS-$(CONFIG_PCM_MULAW_DECODER
  OBJS-$(CONFIG_PCM_MULAW_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S8_DECODER)             += pcm.o
  OBJS-$(CONFIG_PCM_S8_ENCODER)             += pcm.o
 -OBJS-$(CONFIG_PCM_S8_PLANAR_DECODER)      += 8svx.o
 +OBJS-$(CONFIG_PCM_S8_PLANAR_DECODER)      += pcm.o
 +OBJS-$(CONFIG_PCM_S8_PLANAR_ENCODER)      += pcm.o
  OBJS-$(CONFIG_PCM_S16BE_DECODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S16BE_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S16BE_PLANAR_DECODER)   += pcm.o
 +OBJS-$(CONFIG_PCM_S16BE_PLANAR_ENCODER)   += pcm.o
  OBJS-$(CONFIG_PCM_S16LE_DECODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S16LE_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S16LE_PLANAR_DECODER)   += pcm.o
 +OBJS-$(CONFIG_PCM_S16LE_PLANAR_ENCODER)   += pcm.o
  OBJS-$(CONFIG_PCM_S24BE_DECODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S24BE_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S24DAUD_DECODER)        += pcm.o
@@@ -707,17 -549,11 +708,17 @@@ OBJS-$(CONFIG_PCM_S24DAUD_ENCODER
  OBJS-$(CONFIG_PCM_S24LE_DECODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S24LE_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S24LE_PLANAR_DECODER)   += pcm.o
 +OBJS-$(CONFIG_PCM_S24LE_PLANAR_ENCODER)   += pcm.o
  OBJS-$(CONFIG_PCM_S32BE_DECODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S32BE_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S32LE_DECODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S32LE_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_S32LE_PLANAR_DECODER)   += pcm.o
 +OBJS-$(CONFIG_PCM_S32LE_PLANAR_ENCODER)   += pcm.o
 +OBJS-$(CONFIG_PCM_S64BE_DECODER)          += pcm.o
 +OBJS-$(CONFIG_PCM_S64BE_ENCODER)          += pcm.o
 +OBJS-$(CONFIG_PCM_S64LE_DECODER)          += pcm.o
 +OBJS-$(CONFIG_PCM_S64LE_ENCODER)          += pcm.o
  OBJS-$(CONFIG_PCM_U8_DECODER)             += pcm.o
  OBJS-$(CONFIG_PCM_U8_ENCODER)             += pcm.o
  OBJS-$(CONFIG_PCM_U16BE_DECODER)          += pcm.o
@@@ -737,10 -573,7 +738,10 @@@ OBJS-$(CONFIG_PCM_ZORK_DECODER
  OBJS-$(CONFIG_ADPCM_4XM_DECODER)          += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_ADX_DECODER)          += adxdec.o adx.o
  OBJS-$(CONFIG_ADPCM_ADX_ENCODER)          += adxenc.o adx.o
 +OBJS-$(CONFIG_ADPCM_AFC_DECODER)          += adpcm.o adpcm_data.o
 +OBJS-$(CONFIG_ADPCM_AICA_DECODER)         += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_CT_DECODER)           += adpcm.o adpcm_data.o
 +OBJS-$(CONFIG_ADPCM_DTK_DECODER)          += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_EA_DECODER)           += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_EA_MAXIS_XA_DECODER)  += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_EA_R1_DECODER)        += adpcm.o adpcm_data.o
@@@ -751,34 -584,27 +752,34 @@@ OBJS-$(CONFIG_ADPCM_G722_DECODER
  OBJS-$(CONFIG_ADPCM_G722_ENCODER)         += g722.o g722dsp.o g722enc.o
  OBJS-$(CONFIG_ADPCM_G726_DECODER)         += g726.o
  OBJS-$(CONFIG_ADPCM_G726_ENCODER)         += g726.o
 +OBJS-$(CONFIG_ADPCM_G726LE_DECODER)       += g726.o
  OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER)      += adpcm.o adpcm_data.o
 +OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER)     += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER)  += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER)  += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER)      += adpcm.o adpcm_data.o
 +OBJS-$(CONFIG_ADPCM_IMA_OKI_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_QT_DECODER)       += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_QT_ENCODER)       += adpcmenc.o adpcm_data.o
 +OBJS-$(CONFIG_ADPCM_IMA_RAD_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_SMJPEG_DECODER)   += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_WAV_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_WAV_ENCODER)      += adpcmenc.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_IMA_WS_DECODER)       += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_MS_DECODER)           += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_MS_ENCODER)           += adpcmenc.o adpcm_data.o
 +OBJS-$(CONFIG_ADPCM_MTAF_DECODER)         += adpcm.o adpcm_data.o
 +OBJS-$(CONFIG_ADPCM_PSX_DECODER)          += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_SBPRO_2_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_SBPRO_3_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_SBPRO_4_DECODER)      += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_SWF_DECODER)          += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_SWF_ENCODER)          += adpcmenc.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_THP_DECODER)          += adpcm.o adpcm_data.o
 +OBJS-$(CONFIG_ADPCM_THP_LE_DECODER)       += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_VIMA_DECODER)         += vima.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_XA_DECODER)           += adpcm.o adpcm_data.o
  OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER)       += adpcm.o adpcm_data.o
@@@ -788,88 -614,51 +789,88 @@@ OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER
  OBJS-$(CONFIG_D3D11VA)                    += dxva2.o
  OBJS-$(CONFIG_DXVA2)                      += dxva2.o
  OBJS-$(CONFIG_VAAPI)                      += vaapi_decode.o
 -OBJS-$(CONFIG_VDA)                        += vda.o
 +OBJS-$(CONFIG_VDA)                        += vda.o videotoolbox.o
 +OBJS-$(CONFIG_VIDEOTOOLBOX)               += videotoolbox.o
  OBJS-$(CONFIG_VDPAU)                      += vdpau.o
  
  OBJS-$(CONFIG_H263_VAAPI_HWACCEL)         += vaapi_mpeg4.o
 +OBJS-$(CONFIG_H263_VIDEOTOOLBOX_HWACCEL)  += videotoolbox.o
  OBJS-$(CONFIG_H264_D3D11VA_HWACCEL)       += dxva2_h264.o
  OBJS-$(CONFIG_H264_DXVA2_HWACCEL)         += dxva2_h264.o
  OBJS-$(CONFIG_H264_VAAPI_HWACCEL)         += vaapi_h264.o
  OBJS-$(CONFIG_H264_VDA_HWACCEL)           += vda_h264.o
  OBJS-$(CONFIG_H264_VDPAU_HWACCEL)         += vdpau_h264.o
 +OBJS-$(CONFIG_H264_VIDEOTOOLBOX_HWACCEL)  += videotoolbox.o
  OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL)       += dxva2_hevc.o
  OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL)         += dxva2_hevc.o
 +OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL)         += vaapi_hevc.o
  OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL)         += vdpau_hevc.o
  OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL)        += vdpau_mpeg12.o
 +OBJS-$(CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
 +OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL)         += mpegvideo_xvmc.o
  OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL)      += dxva2_mpeg2.o
  OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL)        += dxva2_mpeg2.o
  OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL)        += vaapi_mpeg2.o
  OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL)        += vdpau_mpeg12.o
 +OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
 +OBJS-$(CONFIG_MPEG2_XVMC_HWACCEL)         += mpegvideo_xvmc.o
  OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL)        += vaapi_mpeg4.o
  OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL)        += vdpau_mpeg4.o
 +OBJS-$(CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
  OBJS-$(CONFIG_VC1_D3D11VA_HWACCEL)        += dxva2_vc1.o
  OBJS-$(CONFIG_VC1_DXVA2_HWACCEL)          += dxva2_vc1.o
  OBJS-$(CONFIG_VC1_VAAPI_HWACCEL)          += vaapi_vc1.o
  OBJS-$(CONFIG_VC1_VDPAU_HWACCEL)          += vdpau_vc1.o
 -OBJS-$(CONFIG_VP8_VAAPI_HWACCEL)          += vaapi_vp8.o
 +OBJS-$(CONFIG_VP9_D3D11VA_HWACCEL)        += dxva2_vp9.o
 +OBJS-$(CONFIG_VP9_DXVA2_HWACCEL)          += dxva2_vp9.o
 +OBJS-$(CONFIG_VP9_VAAPI_HWACCEL)          += vaapi_vp9.o
  
  # libavformat dependencies
  OBJS-$(CONFIG_ISO_MEDIA)               += mpeg4audio.o mpegaudiodata.o
  
  OBJS-$(CONFIG_ADTS_MUXER)              += mpeg4audio.o
  OBJS-$(CONFIG_CAF_DEMUXER)             += ac3tab.o
 +OBJS-$(CONFIG_DNXHD_DEMUXER)           += dnxhddata.o
  OBJS-$(CONFIG_FLV_DEMUXER)             += mpeg4audio.o
  OBJS-$(CONFIG_LATM_MUXER)              += mpeg4audio.o
  OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER)    += mpeg4audio.o
  OBJS-$(CONFIG_MATROSKA_MUXER)          += mpeg4audio.o
  OBJS-$(CONFIG_MOV_DEMUXER)             += ac3tab.o
  OBJS-$(CONFIG_MP3_MUXER)               += mpegaudiodata.o mpegaudiodecheader.o
 +OBJS-$(CONFIG_MXF_MUXER)               += dnxhddata.o
  OBJS-$(CONFIG_NUT_MUXER)               += mpegaudiodata.o
 +OBJS-$(CONFIG_NUT_DEMUXER)             += mpegaudiodata.o mpeg4audio.o
 +OBJS-$(CONFIG_RTP_MUXER)               += mpeg4audio.o
  OBJS-$(CONFIG_SPDIF_DEMUXER)           += aacadtsdec.o mpeg4audio.o
  OBJS-$(CONFIG_SPDIF_MUXER)             += dca.o
  OBJS-$(CONFIG_TAK_DEMUXER)             += tak.o
  OBJS-$(CONFIG_WEBM_MUXER)              += mpeg4audio.o
  
 +# libavfilter dependencies
 +OBJS-$(CONFIG_ELBG_FILTER)             += elbg.o
 +
  # external codec libraries
 -OBJS-$(CONFIG_LIBDCADEC_DECODER)          += libdcadec.o dca.o
 -OBJS-$(CONFIG_LIBFAAC_ENCODER)            += libfaac.o
 +OBJS-$(CONFIG_AAC_AT_DECODER)             += audiotoolboxdec.o
 +OBJS-$(CONFIG_AC3_AT_DECODER)             += audiotoolboxdec.o
 +OBJS-$(CONFIG_ADPCM_IMA_QT_AT_DECODER)    += audiotoolboxdec.o
 +OBJS-$(CONFIG_ALAC_AT_DECODER)            += audiotoolboxdec.o
 +OBJS-$(CONFIG_AMR_NB_AT_DECODER)          += audiotoolboxdec.o
 +OBJS-$(CONFIG_EAC3_AT_DECODER)            += audiotoolboxdec.o
 +OBJS-$(CONFIG_GSM_MS_AT_DECODER)          += audiotoolboxdec.o
 +OBJS-$(CONFIG_ILBC_AT_DECODER)            += audiotoolboxdec.o
 +OBJS-$(CONFIG_MP1_AT_DECODER)             += audiotoolboxdec.o mpegaudiodata.o mpegaudiodecheader.o
 +OBJS-$(CONFIG_MP2_AT_DECODER)             += audiotoolboxdec.o mpegaudiodata.o mpegaudiodecheader.o
 +OBJS-$(CONFIG_MP3_AT_DECODER)             += audiotoolboxdec.o mpegaudiodata.o mpegaudiodecheader.o
 +OBJS-$(CONFIG_PCM_MULAW_AT_DECODER)       += audiotoolboxdec.o
 +OBJS-$(CONFIG_PCM_ALAW_AT_DECODER)        += audiotoolboxdec.o
 +OBJS-$(CONFIG_QDMC_AT_DECODER)            += audiotoolboxdec.o
 +OBJS-$(CONFIG_QDM2_AT_DECODER)            += audiotoolboxdec.o
 +OBJS-$(CONFIG_AAC_AT_ENCODER)             += audiotoolboxenc.o
 +OBJS-$(CONFIG_ALAC_AT_ENCODER)            += audiotoolboxenc.o
 +OBJS-$(CONFIG_ILBC_AT_ENCODER)            += audiotoolboxenc.o
 +OBJS-$(CONFIG_PCM_ALAW_AT_ENCODER)        += audiotoolboxenc.o
 +OBJS-$(CONFIG_PCM_MULAW_AT_ENCODER)       += audiotoolboxenc.o
 +OBJS-$(CONFIG_LIBCELT_DECODER)            += libcelt_dec.o
  OBJS-$(CONFIG_LIBFDK_AAC_DECODER)         += libfdk-aacdec.o
  OBJS-$(CONFIG_LIBFDK_AAC_ENCODER)         += libfdk-aacenc.o
  OBJS-$(CONFIG_LIBGSM_DECODER)             += libgsmdec.o
@@@ -879,7 -668,7 +880,7 @@@ OBJS-$(CONFIG_LIBGSM_MS_ENCODER
  OBJS-$(CONFIG_LIBILBC_DECODER)            += libilbc.o
  OBJS-$(CONFIG_LIBILBC_ENCODER)            += libilbc.o
  OBJS-$(CONFIG_LIBKVAZAAR_ENCODER)         += libkvazaar.o
 -OBJS-$(CONFIG_LIBMP3LAME_ENCODER)         += libmp3lame.o mpegaudiodecheader.o
 +OBJS-$(CONFIG_LIBMP3LAME_ENCODER)         += libmp3lame.o mpegaudiodata.o mpegaudiodecheader.o
  OBJS-$(CONFIG_LIBOPENCORE_AMRNB_DECODER)  += libopencore-amr.o
  OBJS-$(CONFIG_LIBOPENCORE_AMRNB_ENCODER)  += libopencore-amr.o
  OBJS-$(CONFIG_LIBOPENCORE_AMRWB_DECODER)  += libopencore-amr.o
@@@ -895,28 -684,25 +896,28 @@@ OBJS-$(CONFIG_LIBSCHROEDINGER_DECODER
                                               libschroedinger.o
  OBJS-$(CONFIG_LIBSCHROEDINGER_ENCODER)    += libschroedingerenc.o \
                                               libschroedinger.o
 +OBJS-$(CONFIG_LIBSHINE_ENCODER)           += libshine.o
  OBJS-$(CONFIG_LIBSPEEX_DECODER)           += libspeexdec.o
  OBJS-$(CONFIG_LIBSPEEX_ENCODER)           += libspeexenc.o
  OBJS-$(CONFIG_LIBTHEORA_ENCODER)          += libtheoraenc.o
  OBJS-$(CONFIG_LIBTWOLAME_ENCODER)         += libtwolame.o
 -OBJS-$(CONFIG_LIBVO_AACENC_ENCODER)       += libvo-aacenc.o mpeg4audio.o
  OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER)     += libvo-amrwbenc.o
 -OBJS-$(CONFIG_LIBVORBIS_ENCODER)          += libvorbis.o \
 +OBJS-$(CONFIG_LIBVORBIS_DECODER)          += libvorbisdec.o
 +OBJS-$(CONFIG_LIBVORBIS_ENCODER)          += libvorbisenc.o \
                                               vorbis_data.o
 -OBJS-$(CONFIG_LIBVPX_VP8_DECODER)         += libvpxdec.o libvpx.o
 -OBJS-$(CONFIG_LIBVPX_VP8_ENCODER)         += libvpxenc.o libvpx.o
 +OBJS-$(CONFIG_LIBVPX_VP8_DECODER)         += libvpxdec.o
 +OBJS-$(CONFIG_LIBVPX_VP8_ENCODER)         += libvpxenc.o
  OBJS-$(CONFIG_LIBVPX_VP9_DECODER)         += libvpxdec.o libvpx.o
  OBJS-$(CONFIG_LIBVPX_VP9_ENCODER)         += libvpxenc.o libvpx.o
  OBJS-$(CONFIG_LIBWAVPACK_ENCODER)         += libwavpackenc.o
 -OBJS-$(CONFIG_LIBWEBP_ENCODER)            += libwebpenc.o
 +OBJS-$(CONFIG_LIBWEBP_ENCODER)            += libwebpenc_common.o libwebpenc.o
 +OBJS-$(CONFIG_LIBWEBP_ANIM_ENCODER)       += libwebpenc_common.o libwebpenc_animencoder.o
  OBJS-$(CONFIG_LIBX262_ENCODER)            += libx264.o
  OBJS-$(CONFIG_LIBX264_ENCODER)            += libx264.o
  OBJS-$(CONFIG_LIBX265_ENCODER)            += libx265.o
  OBJS-$(CONFIG_LIBXAVS_ENCODER)            += libxavs.o
  OBJS-$(CONFIG_LIBXVID_ENCODER)            += libxvid.o
 +OBJS-$(CONFIG_LIBZVBI_TELETEXT_DECODER)   += libzvbi-teletextdec.o ass.o
  
  # parsers
  OBJS-$(CONFIG_AAC_LATM_PARSER)         += latm_parser.o
@@@ -928,17 -714,13 +929,17 @@@ OBJS-$(CONFIG_ADX_PARSER)              
  OBJS-$(CONFIG_BMP_PARSER)              += bmp_parser.o
  OBJS-$(CONFIG_CAVSVIDEO_PARSER)        += cavs_parser.o
  OBJS-$(CONFIG_COOK_PARSER)             += cook_parser.o
 -OBJS-$(CONFIG_DCA_PARSER)              += dca_parser.o dca.o
 +OBJS-$(CONFIG_DCA_PARSER)              += dca_parser.o dca_exss.o dca.o
  OBJS-$(CONFIG_DIRAC_PARSER)            += dirac_parser.o
  OBJS-$(CONFIG_DNXHD_PARSER)            += dnxhd_parser.o
  OBJS-$(CONFIG_DPX_PARSER)              += dpx_parser.o
 +OBJS-$(CONFIG_DVAUDIO_PARSER)          += dvaudio_parser.o
  OBJS-$(CONFIG_DVBSUB_PARSER)           += dvbsub_parser.o
 +OBJS-$(CONFIG_DVD_NAV_PARSER)          += dvd_nav_parser.o
  OBJS-$(CONFIG_DVDSUB_PARSER)           += dvdsub_parser.o
 -OBJS-$(CONFIG_FLAC_PARSER)             += flac_parser.o flacdata.o flac.o
 +OBJS-$(CONFIG_FLAC_PARSER)             += flac_parser.o flacdata.o flac.o \
 +                                          vorbis_data.o
 +OBJS-$(CONFIG_G729_PARSER)             += g729_parser.o
  OBJS-$(CONFIG_GSM_PARSER)              += gsm_parser.o
  OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
  OBJS-$(CONFIG_H263_PARSER)             += h263_parser.o
@@@ -949,7 -731,6 +950,7 @@@ OBJS-$(CONFIG_MLP_PARSER)              
  OBJS-$(CONFIG_MPEG4VIDEO_PARSER)       += mpeg4video_parser.o h263.o \
                                            mpeg4videodec.o mpeg4video.o \
                                            ituh263dec.o h263dec.o h263data.o
 +OBJS-$(CONFIG_PNG_PARSER)              += png_parser.o
  OBJS-$(CONFIG_MPEGAUDIO_PARSER)        += mpegaudio_parser.o \
                                            mpegaudiodecheader.o mpegaudiodata.o
  OBJS-$(CONFIG_MPEGVIDEO_PARSER)        += mpegvideo_parser.o    \
@@@ -959,101 -740,63 +960,101 @@@ OBJS-$(CONFIG_PNG_PARSER)              
  OBJS-$(CONFIG_PNM_PARSER)              += pnm_parser.o pnm.o
  OBJS-$(CONFIG_RV30_PARSER)             += rv34_parser.o
  OBJS-$(CONFIG_RV40_PARSER)             += rv34_parser.o
 +OBJS-$(CONFIG_SIPR_PARSER)             += sipr_parser.o
  OBJS-$(CONFIG_TAK_PARSER)              += tak_parser.o tak.o
  OBJS-$(CONFIG_VC1_PARSER)              += vc1_parser.o vc1.o vc1data.o  \
                                            simple_idct.o wmv2data.o
  OBJS-$(CONFIG_VP3_PARSER)              += vp3_parser.o
  OBJS-$(CONFIG_VP8_PARSER)              += vp8_parser.o
 +OBJS-$(CONFIG_VP9_PARSER)              += vp9_parser.o
 +OBJS-$(CONFIG_XMA_PARSER)              += xma_parser.o
  
  # bitstream filters
  OBJS-$(CONFIG_AAC_ADTSTOASC_BSF)          += aac_adtstoasc_bsf.o aacadtsdec.o \
                                               mpeg4audio.o
  OBJS-$(CONFIG_CHOMP_BSF)                  += chomp_bsf.o
  OBJS-$(CONFIG_DUMP_EXTRADATA_BSF)         += dump_extradata_bsf.o
 -OBJS-$(CONFIG_EXTRACT_EXTRADATA_BSF)      += extract_extradata_bsf.o
 +OBJS-$(CONFIG_DCA_CORE_BSF)               += dca_core_bsf.o
 +OBJS-$(CONFIG_EXTRACT_EXTRADATA_BSF)      += extract_extradata_bsf.o    \
 +                                             h2645_parse.o
  OBJS-$(CONFIG_H264_MP4TOANNEXB_BSF)       += h264_mp4toannexb_bsf.o
  OBJS-$(CONFIG_HEVC_MP4TOANNEXB_BSF)       += hevc_mp4toannexb_bsf.o
  OBJS-$(CONFIG_IMX_DUMP_HEADER_BSF)        += imx_dump_header_bsf.o
  OBJS-$(CONFIG_MJPEG2JPEG_BSF)             += mjpeg2jpeg_bsf.o
  OBJS-$(CONFIG_MJPEGA_DUMP_HEADER_BSF)     += mjpega_dump_header_bsf.o
 +OBJS-$(CONFIG_MPEG4_UNPACK_BFRAMES_BSF)   += mpeg4_unpack_bframes_bsf.o
  OBJS-$(CONFIG_MOV2TEXTSUB_BSF)            += movsub_bsf.o
 +OBJS-$(CONFIG_MP3_HEADER_DECOMPRESS_BSF)  += mp3_header_decompress_bsf.o \
 +                                             mpegaudiodata.o
  OBJS-$(CONFIG_NOISE_BSF)                  += noise_bsf.o
  OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF)       += remove_extradata_bsf.o
  OBJS-$(CONFIG_TEXT2MOVSUB_BSF)            += movsub_bsf.o
 +OBJS-$(CONFIG_VP9_SUPERFRAME_BSF)         += vp9_superframe_bsf.o
  
  # thread libraries
  OBJS-$(HAVE_LIBC_MSVCRT)               += file_open.o
  OBJS-$(HAVE_THREADS)                   += pthread.o pthread_slice.o pthread_frame.o
  
 +OBJS-$(CONFIG_FRAME_THREAD_ENCODER)    += frame_thread_encoder.o
 +
 +# Windows resource file
 +SLIBOBJS-$(HAVE_GNU_WINDRES)           += avcodecres.o
 +
  SKIPHEADERS                            += %_tablegen.h                  \
                                            %_tables.h                    \
 -                                          aac_tablegen_decl.h           \
                                            fft-internal.h                \
                                            tableprint.h                  \
 +                                          tableprint_vlc.h              \
 +                                          aaccoder_twoloop.h            \
 +                                          aaccoder_trellis.h            \
 +                                          aacenc_quantization.h         \
 +                                          aacenc_quantization_misc.h    \
                                            $(ARCH)/vp56_arith.h          \
  
  SKIPHEADERS-$(CONFIG_D3D11VA)          += d3d11va.h dxva2_internal.h
  SKIPHEADERS-$(CONFIG_DXVA2)            += dxva2.h dxva2_internal.h
 +SKIPHEADERS-$(CONFIG_JNI)              += ffjni.h
  SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER)  += libschroedinger.h
  SKIPHEADERS-$(CONFIG_LIBVPX)           += libvpx.h
 -SKIPHEADERS-$(CONFIG_MPEG_XVMC_DECODER) += xvmc.h
 +SKIPHEADERS-$(CONFIG_LIBWEBP_ENCODER)  += libwebpenc_common.h
 +SKIPHEADERS-$(CONFIG_MEDIACODEC)       += mediacodecdec_common.h mediacodec_surface.h mediacodec_wrapper.h mediacodec_sw_buffer.h
  SKIPHEADERS-$(CONFIG_NVENC)            += nvenc.h
  SKIPHEADERS-$(CONFIG_QSV)              += qsv.h qsv_internal.h
  SKIPHEADERS-$(CONFIG_QSVDEC)           += qsvdec.h
  SKIPHEADERS-$(CONFIG_QSVENC)           += qsvenc.h
 +SKIPHEADERS-$(CONFIG_XVMC)             += xvmc.h
  SKIPHEADERS-$(CONFIG_VAAPI)            += vaapi_decode.h vaapi_encode.h
 -SKIPHEADERS-$(CONFIG_VDA)              += vda.h vda_internal.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
 +
 +TESTPROGS = avpacket                                                    \
 +            celp_math                                                   \
 +            imgconvert                                                  \
 +            jpeg2000dwt                                                 \
 +            mathops                                                    \
 +            options                                                     \
 +            mjpegenc_huffman                                            \
 +            utils                                                       \
  
 -TESTPROGS-$(CONFIG_FFT)                   += fft fft-fixed
 +TESTPROGS-$(CONFIG_CABAC)                 += cabac
 +TESTPROGS-$(CONFIG_DCT)                   += avfft
 +TESTPROGS-$(CONFIG_FFT)                   += fft fft-fixed fft-fixed32
  TESTPROGS-$(CONFIG_GOLOMB)                += golomb
  TESTPROGS-$(CONFIG_IDCTDSP)               += dct
  TESTPROGS-$(CONFIG_IIRFILTER)             += iirfilter
 +TESTPROGS-$(HAVE_MMX)                     += motion
  TESTPROGS-$(CONFIG_RANGECODER)            += rangecoder
 +TESTPROGS-$(CONFIG_SNOW_ENCODER)          += snowenc
  
  TESTOBJS = dctref.o
  
 -HOSTPROGS = aac_tablegen                                                \
 -            aacps_tablegen                                              \
 +TOOLS = fourcc2pixfmt
 +
 +HOSTPROGS = aacps_tablegen                                              \
 +            aacps_fixed_tablegen                                        \
              cbrt_tablegen                                               \
 +            cbrt_fixed_tablegen                                         \
              cos_tablegen                                                \
              dv_tablegen                                                 \
              motionpixels_tablegen                                       \
              pcm_tablegen                                                \
              qdm2_tablegen                                               \
              sinewin_tablegen                                            \
 +            sinewin_fixed_tablegen                                      \
  
  CLEANFILES = *_tables.c *_tables.h *_tablegen$(HOSTEXESUF)
  
@@@ -1080,9 -822,8 +1081,9 @@@ els
  $(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0
  endif
  
 -GEN_HEADERS = cbrt_tables.h aacps_tables.h aac_tables.h dv_tables.h     \
 -              sinewin_tables.h mpegaudio_tables.h motionpixels_tables.h \
 +GEN_HEADERS = cbrt_tables.h cbrt_fixed_tables.h aacps_tables.h aacps_fixed_tables.h \
 +              dv_tables.h     \
 +              sinewin_tables.h sinewin_fixed_tables.h mpegaudio_tables.h motionpixels_tables.h \
                pcm_tables.h qdm2_tables.h
  GEN_HEADERS := $(addprefix $(SUBDIR), $(GEN_HEADERS))
  
@@@ -1090,11 -831,9 +1091,11 @@@ $(GEN_HEADERS): $(SUBDIR)%_tables.h: $(
        $(M)./$< > $@
  
  ifdef CONFIG_HARDCODED_TABLES
 -$(SUBDIR)aacdec.o: $(SUBDIR)cbrt_tables.h
 -$(SUBDIR)aacps.o: $(SUBDIR)aacps_tables.h
 -$(SUBDIR)aactab.o: $(SUBDIR)aac_tables.h
 +$(SUBDIR)cbrt_data.o: $(SUBDIR)cbrt_tables.h
 +$(SUBDIR)cbrt_data_fixed.o: $(SUBDIR)cbrt_fixed_tables.h
 +$(SUBDIR)aacps_float.o: $(SUBDIR)aacps_tables.h
 +$(SUBDIR)aacps_fixed.o: $(SUBDIR)aacps_fixed_tables.h
 +$(SUBDIR)aactab_fixed.o: $(SUBDIR)aac_fixed_tables.h
  $(SUBDIR)dvenc.o: $(SUBDIR)dv_tables.h
  $(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h
  $(SUBDIR)mpegaudiodec_fixed.o: $(SUBDIR)mpegaudio_tables.h
@@@ -1102,5 -841,4 +1103,5 @@@ $(SUBDIR)mpegaudiodec_float.o: $(SUBDIR
  $(SUBDIR)pcm.o: $(SUBDIR)pcm_tables.h
  $(SUBDIR)qdm2.o: $(SUBDIR)qdm2_tables.h
  $(SUBDIR)sinewin.o: $(SUBDIR)sinewin_tables.h
 +$(SUBDIR)sinewin_fixed.o: $(SUBDIR)sinewin_fixed_tables.h
  endif
diff --combined libavcodec/encode.c
index 0000000,fc27a07..6e9d487
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,360 +1,454 @@@
 - * This file is part of Libav.
+ /*
+  * generic encoding-related code
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
 -int ff_alloc_packet(AVPacket *avpkt, int size)
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "libavutil/attributes.h"
+ #include "libavutil/avassert.h"
+ #include "libavutil/frame.h"
+ #include "libavutil/imgutils.h"
+ #include "libavutil/internal.h"
+ #include "libavutil/samplefmt.h"
+ #include "avcodec.h"
++#include "frame_thread_encoder.h"
+ #include "internal.h"
 -    if (size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
++int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
+ {
 -        if (avpkt->size < size)
++    if (avpkt->size < 0) {
++        av_log(avctx, AV_LOG_ERROR, "Invalid negative user packet size %d\n", avpkt->size);
++        return AVERROR(EINVAL);
++    }
++    if (size < 0 || size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
++        av_log(avctx, AV_LOG_ERROR, "Invalid minimum required packet size %"PRId64" (max allowed is %d)\n",
++               size, INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE);
+         return AVERROR(EINVAL);
++    }
++
++    if (avctx && 2*min_size < size) { // FIXME The factor needs to be finetuned
++        av_assert0(!avpkt->data || avpkt->data != avctx->internal->byte_buffer);
++        if (!avpkt->data || avpkt->size < size) {
++            av_fast_padded_malloc(&avctx->internal->byte_buffer, &avctx->internal->byte_buffer_size, size);
++            avpkt->data = avctx->internal->byte_buffer;
++            avpkt->size = avctx->internal->byte_buffer_size;
++        }
++    }
+     if (avpkt->data) {
+         AVBufferRef *buf = avpkt->buf;
 -        return av_new_packet(avpkt, size);
++        if (avpkt->size < size) {
++            av_log(avctx, AV_LOG_ERROR, "User packet is too small (%d < %"PRId64")\n", avpkt->size, size);
+             return AVERROR(EINVAL);
++        }
+         av_init_packet(avpkt);
+         avpkt->buf      = buf;
+         avpkt->size     = size;
+         return 0;
+     } else {
 -    AVFrame tmp;
++        int ret = av_new_packet(avpkt, size);
++        if (ret < 0)
++            av_log(avctx, AV_LOG_ERROR, "Failed to allocate packet of size %"PRId64"\n", size);
++        return ret;
+     }
+ }
++int ff_alloc_packet(AVPacket *avpkt, int size)
++{
++    return ff_alloc_packet2(NULL, avpkt, size, 0);
++}
++
+ /**
+  * Pad last frame with silence.
+  */
+ static int pad_last_frame(AVCodecContext *s, AVFrame **dst, const AVFrame *src)
+ {
+     AVFrame *frame = NULL;
+     int ret;
+     if (!(frame = av_frame_alloc()))
+         return AVERROR(ENOMEM);
+     frame->format         = src->format;
+     frame->channel_layout = src->channel_layout;
++    av_frame_set_channels(frame, av_frame_get_channels(src));
+     frame->nb_samples     = s->frame_size;
+     ret = av_frame_get_buffer(frame, 32);
+     if (ret < 0)
+         goto fail;
+     ret = av_frame_copy_props(frame, src);
+     if (ret < 0)
+         goto fail;
+     if ((ret = av_samples_copy(frame->extended_data, src->extended_data, 0, 0,
+                                src->nb_samples, s->channels, s->sample_fmt)) < 0)
+         goto fail;
+     if ((ret = av_samples_set_silence(frame->extended_data, src->nb_samples,
+                                       frame->nb_samples - src->nb_samples,
+                                       s->channels, s->sample_fmt)) < 0)
+         goto fail;
+     *dst = frame;
+     return 0;
+ fail:
+     av_frame_free(&frame);
+     return ret;
+ }
+ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
+                                               AVPacket *avpkt,
+                                               const AVFrame *frame,
+                                               int *got_packet_ptr)
+ {
 -    int user_packet = !!avpkt->data;
++    AVFrame *extended_frame = NULL;
+     AVFrame *padded_frame = NULL;
+     int ret;
 -        tmp = *frame;
 -        tmp.extended_data = tmp.data;
 -        frame = &tmp;
++    AVPacket user_pkt = *avpkt;
++    int needs_realloc = !user_pkt.data;
+     *got_packet_ptr = 0;
+     if (!avctx->codec->encode2) {
+         av_log(avctx, AV_LOG_ERROR, "This encoder requires using the avcodec_send_frame() API.\n");
+         return AVERROR(ENOSYS);
+     }
+     if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) {
+         av_packet_unref(avpkt);
+         av_init_packet(avpkt);
+         return 0;
+     }
+     /* ensure that extended_data is properly set */
+     if (frame && !frame->extended_data) {
+         if (av_sample_fmt_is_planar(avctx->sample_fmt) &&
+             avctx->channels > AV_NUM_DATA_POINTERS) {
+             av_log(avctx, AV_LOG_ERROR, "Encoding to a planar sample format, "
+                                         "with more than %d channels, but extended_data is not set.\n",
+                    AV_NUM_DATA_POINTERS);
+             return AVERROR(EINVAL);
+         }
+         av_log(avctx, AV_LOG_WARNING, "extended_data is not set.\n");
 -            if (frame->nb_samples > avctx->frame_size)
 -                return AVERROR(EINVAL);
++        extended_frame = av_frame_alloc();
++        if (!extended_frame)
++            return AVERROR(ENOMEM);
++
++        memcpy(extended_frame, frame, sizeof(AVFrame));
++        extended_frame->extended_data = extended_frame->data;
++        frame = extended_frame;
+     }
+     /* extract audio service type metadata */
+     if (frame) {
+         AVFrameSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_AUDIO_SERVICE_TYPE);
+         if (sd && sd->size >= sizeof(enum AVAudioServiceType))
+             avctx->audio_service_type = *(enum AVAudioServiceType*)sd->data;
+     }
+     /* check for valid frame size */
+     if (frame) {
+         if (avctx->codec->capabilities & AV_CODEC_CAP_SMALL_LAST_FRAME) {
 -                    return ret;
++            if (frame->nb_samples > avctx->frame_size) {
++                av_log(avctx, AV_LOG_ERROR, "more samples than frame size (avcodec_encode_audio2)\n");
++                ret = AVERROR(EINVAL);
++                goto end;
++            }
+         } else if (!(avctx->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)) {
+             if (frame->nb_samples < avctx->frame_size &&
+                 !avctx->internal->last_audio_frame) {
+                 ret = pad_last_frame(avctx, &padded_frame, frame);
+                 if (ret < 0)
 -        if (!user_packet && avpkt->size) {
 -            ret = av_buffer_realloc(&avpkt->buf, avpkt->size);
++                    goto end;
+                 frame = padded_frame;
+                 avctx->internal->last_audio_frame = 1;
+             }
+             if (frame->nb_samples != avctx->frame_size) {
++                av_log(avctx, AV_LOG_ERROR, "nb_samples (%d) != frame_size (%d) (avcodec_encode_audio2)\n", frame->nb_samples, avctx->frame_size);
+                 ret = AVERROR(EINVAL);
+                 goto end;
+             }
+         }
+     }
++    av_assert0(avctx->codec->encode2);
++
+     ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr);
+     if (!ret) {
+         if (*got_packet_ptr) {
+             if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) {
+                 if (avpkt->pts == AV_NOPTS_VALUE)
+                     avpkt->pts = frame->pts;
+                 if (!avpkt->duration)
+                     avpkt->duration = ff_samples_to_time_base(avctx,
+                                                               frame->nb_samples);
+             }
+             avpkt->dts = avpkt->pts;
+         } else {
+             avpkt->size = 0;
+         }
++    }
++    if (avpkt->data && avpkt->data == avctx->internal->byte_buffer) {
++        needs_realloc = 0;
++        if (user_pkt.data) {
++            if (user_pkt.size >= avpkt->size) {
++                memcpy(user_pkt.data, avpkt->data, avpkt->size);
++            } else {
++                av_log(avctx, AV_LOG_ERROR, "Provided packet is too small, needs to be %d\n", avpkt->size);
++                avpkt->size = user_pkt.size;
++                ret = -1;
++            }
++            avpkt->buf      = user_pkt.buf;
++            avpkt->data     = user_pkt.data;
++        } else {
++            if (av_dup_packet(avpkt) < 0) {
++                ret = AVERROR(ENOMEM);
++            }
++        }
++    }
 -    int user_packet = !!avpkt->data;
++    if (!ret) {
++        if (needs_realloc && avpkt->data) {
++            ret = av_buffer_realloc(&avpkt->buf, avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE);
+             if (ret >= 0)
+                 avpkt->data = avpkt->buf->data;
+         }
+         avctx->frame_number++;
+     }
+     if (ret < 0 || !*got_packet_ptr) {
+         av_packet_unref(avpkt);
+         av_init_packet(avpkt);
+         goto end;
+     }
+     /* NOTE: if we add any audio encoders which output non-keyframe packets,
+      *       this needs to be moved to the encoders, but for now we can do it
+      *       here to simplify things */
+     avpkt->flags |= AV_PKT_FLAG_KEY;
+ end:
+     av_frame_free(&padded_frame);
++    av_free(extended_frame);
+ #if FF_API_AUDIOENC_DELAY
+     avctx->delay = avctx->initial_padding;
+ #endif
+     return ret;
+ }
+ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx,
+                                               AVPacket *avpkt,
+                                               const AVFrame *frame,
+                                               int *got_packet_ptr)
+ {
+     int ret;
 -    if (av_image_check_size(avctx->width, avctx->height, 0, avctx))
++    AVPacket user_pkt = *avpkt;
++    int needs_realloc = !user_pkt.data;
+     *got_packet_ptr = 0;
+     if (!avctx->codec->encode2) {
+         av_log(avctx, AV_LOG_ERROR, "This encoder requires using the avcodec_send_frame() API.\n");
+         return AVERROR(ENOSYS);
+     }
++    if(CONFIG_FRAME_THREAD_ENCODER &&
++       avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))
++        return ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr);
++
++    if ((avctx->flags&AV_CODEC_FLAG_PASS1) && avctx->stats_out)
++        avctx->stats_out[0] = '\0';
++
+     if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) {
+         av_packet_unref(avpkt);
+         av_init_packet(avpkt);
+         avpkt->size = 0;
+         return 0;
+     }
 -        if (!user_packet && avpkt->size) {
 -            ret = av_buffer_realloc(&avpkt->buf, avpkt->size);
++    if (av_image_check_size2(avctx->width, avctx->height, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx))
+         return AVERROR(EINVAL);
++    if (frame && frame->format == AV_PIX_FMT_NONE)
++        av_log(avctx, AV_LOG_WARNING, "AVFrame.format is not set\n");
++    if (frame && (frame->width == 0 || frame->height == 0))
++        av_log(avctx, AV_LOG_WARNING, "AVFrame.width or height is not set\n");
++
+     av_assert0(avctx->codec->encode2);
+     ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr);
++    av_assert0(ret <= 0);
++
++    emms_c();
++
++    if (avpkt->data && avpkt->data == avctx->internal->byte_buffer) {
++        needs_realloc = 0;
++        if (user_pkt.data) {
++            if (user_pkt.size >= avpkt->size) {
++                memcpy(user_pkt.data, avpkt->data, avpkt->size);
++            } else {
++                av_log(avctx, AV_LOG_ERROR, "Provided packet is too small, needs to be %d\n", avpkt->size);
++                avpkt->size = user_pkt.size;
++                ret = -1;
++            }
++            avpkt->buf      = user_pkt.buf;
++            avpkt->data     = user_pkt.data;
++        } else {
++            if (av_dup_packet(avpkt) < 0) {
++                ret = AVERROR(ENOMEM);
++            }
++        }
++    }
++
+     if (!ret) {
+         if (!*got_packet_ptr)
+             avpkt->size = 0;
+         else if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
+             avpkt->pts = avpkt->dts = frame->pts;
 -    emms_c();
++        if (needs_realloc && avpkt->data) {
++            ret = av_buffer_realloc(&avpkt->buf, avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE);
+             if (ret >= 0)
+                 avpkt->data = avpkt->buf->data;
+         }
+         avctx->frame_number++;
+     }
+     if (ret < 0 || !*got_packet_ptr)
+         av_packet_unref(avpkt);
 -    if (sub->num_rects == 0 || !sub->rects)
 -        return -1;
+     return ret;
+ }
+ int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+                             const AVSubtitle *sub)
+ {
+     int ret;
+     if (sub->start_display_time) {
+         av_log(avctx, AV_LOG_ERROR, "start_display_time must be 0.\n");
+         return -1;
+     }
++
+     ret = avctx->codec->encode_sub(avctx, buf, buf_size, sub);
+     avctx->frame_number++;
+     return ret;
+ }
+ static int do_encode(AVCodecContext *avctx, const AVFrame *frame, int *got_packet)
+ {
+     int ret;
+     *got_packet = 0;
+     av_packet_unref(avctx->internal->buffer_pkt);
+     avctx->internal->buffer_pkt_valid = 0;
+     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+         ret = avcodec_encode_video2(avctx, avctx->internal->buffer_pkt,
+                                     frame, got_packet);
+     } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
+         ret = avcodec_encode_audio2(avctx, avctx->internal->buffer_pkt,
+                                     frame, got_packet);
+     } else {
+         ret = AVERROR(EINVAL);
+     }
+     if (ret >= 0 && *got_packet) {
+         // Encoders must always return ref-counted buffers.
+         // Side-data only packets have no data and can be not ref-counted.
+         av_assert0(!avctx->internal->buffer_pkt->data || avctx->internal->buffer_pkt->buf);
+         avctx->internal->buffer_pkt_valid = 1;
+         ret = 0;
+     } else {
+         av_packet_unref(avctx->internal->buffer_pkt);
+     }
+     return ret;
+ }
+ int attribute_align_arg avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
+ {
+     if (!avcodec_is_open(avctx) || !av_codec_is_encoder(avctx->codec))
+         return AVERROR(EINVAL);
+     if (avctx->internal->draining)
+         return AVERROR_EOF;
+     if (!frame) {
+         avctx->internal->draining = 1;
+         if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
+             return 0;
+     }
+     if (avctx->codec->send_frame)
+         return avctx->codec->send_frame(avctx, frame);
+     // Emulation via old API. Do it here instead of avcodec_receive_packet, because:
+     // 1. if the AVFrame is not refcounted, the copying will be much more
+     //    expensive than copying the packet data
+     // 2. assume few users use non-refcounted AVPackets, so usually no copy is
+     //    needed
+     if (avctx->internal->buffer_pkt_valid)
+         return AVERROR(EAGAIN);
+     return do_encode(avctx, frame, &(int){0});
+ }
+ int attribute_align_arg avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
+ {
+     av_packet_unref(avpkt);
+     if (!avcodec_is_open(avctx) || !av_codec_is_encoder(avctx->codec))
+         return AVERROR(EINVAL);
+     if (avctx->codec->receive_packet) {
+         if (avctx->internal->draining && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
+             return AVERROR_EOF;
+         return avctx->codec->receive_packet(avctx, avpkt);
+     }
+     // Emulation via old API.
+     if (!avctx->internal->buffer_pkt_valid) {
+         int got_packet;
+         int ret;
+         if (!avctx->internal->draining)
+             return AVERROR(EAGAIN);
+         ret = do_encode(avctx, NULL, &got_packet);
+         if (ret < 0)
+             return ret;
+         if (ret >= 0 && !got_packet)
+             return AVERROR_EOF;
+     }
+     av_packet_move_ref(avpkt, avctx->internal->buffer_pkt);
+     avctx->internal->buffer_pkt_valid = 0;
+     return 0;
+ }
diff --combined libavcodec/utils.c
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2001 Fabrice Bellard
   * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
   */
  
  #include "config.h"
 +#include "libavutil/atomic.h"
  #include "libavutil/attributes.h"
  #include "libavutil/avassert.h"
  #include "libavutil/avstring.h"
 +#include "libavutil/bprint.h"
  #include "libavutil/channel_layout.h"
  #include "libavutil/crc.h"
  #include "libavutil/frame.h"
  #include "libavutil/hwcontext.h"
  #include "libavutil/internal.h"
  #include "libavutil/mathematics.h"
 +#include "libavutil/mem_internal.h"
  #include "libavutil/pixdesc.h"
  #include "libavutil/imgutils.h"
  #include "libavutil/samplefmt.h"
  #include "libavutil/dict.h"
 +#include "libavutil/thread.h"
  #include "avcodec.h"
  #include "libavutil/opt.h"
  #include "me_cmp.h"
  #include "mpegvideo.h"
  #include "thread.h"
 +#include "frame_thread_encoder.h"
  #include "internal.h"
 +#include "raw.h"
  #include "bytestream.h"
  #include "version.h"
  #include <stdlib.h>
  #include <stdarg.h>
  #include <limits.h>
  #include <float.h>
 +#if CONFIG_ICONV
 +# include <iconv.h>
 +#endif
 +
 +#include "libavutil/ffversion.h"
 +const char av_codec_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
 +
 +#if HAVE_PTHREADS || HAVE_W32THREADS || HAVE_OS2THREADS
 +static int default_lockmgr_cb(void **arg, enum AVLockOp op)
 +{
 +    void * volatile * mutex = arg;
 +    int err;
 +
 +    switch (op) {
 +    case AV_LOCK_CREATE:
 +        return 0;
 +    case AV_LOCK_OBTAIN:
 +        if (!*mutex) {
 +            pthread_mutex_t *tmp = av_malloc(sizeof(pthread_mutex_t));
 +            if (!tmp)
 +                return AVERROR(ENOMEM);
 +            if ((err = pthread_mutex_init(tmp, NULL))) {
 +                av_free(tmp);
 +                return AVERROR(err);
 +            }
 +            if (avpriv_atomic_ptr_cas(mutex, NULL, tmp)) {
 +                pthread_mutex_destroy(tmp);
 +                av_free(tmp);
 +            }
 +        }
 +
 +        if ((err = pthread_mutex_lock(*mutex)))
 +            return AVERROR(err);
  
 +        return 0;
 +    case AV_LOCK_RELEASE:
 +        if ((err = pthread_mutex_unlock(*mutex)))
 +            return AVERROR(err);
 +
 +        return 0;
 +    case AV_LOCK_DESTROY:
 +        if (*mutex)
 +            pthread_mutex_destroy(*mutex);
 +        av_free(*mutex);
 +        avpriv_atomic_ptr_cas(mutex, *mutex, NULL);
 +        return 0;
 +    }
 +    return 1;
 +}
 +static int (*lockmgr_cb)(void **mutex, enum AVLockOp op) = default_lockmgr_cb;
 +#else
 +static int (*lockmgr_cb)(void **mutex, enum AVLockOp op) = NULL;
 +#endif
 +
 +
 +volatile int ff_avcodec_locked;
  static int volatile entangled_thread_counter = 0;
 -static int (*lockmgr_cb)(void **mutex, enum AVLockOp op);
  static void *codec_mutex;
  static void *avformat_mutex;
  
  void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
  {
 -    void **p = ptr;
 +    uint8_t **p = ptr;
      if (min_size > SIZE_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
          av_freep(p);
          *size = 0;
          return;
      }
 -    av_fast_malloc(p, size, min_size + AV_INPUT_BUFFER_PADDING_SIZE);
 -    if (*size)
 -        memset((uint8_t *)*p + min_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 +    if (!ff_fast_malloc(p, size, min_size + AV_INPUT_BUFFER_PADDING_SIZE, 1))
 +        memset(*p + min_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 +}
 +
 +void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size)
 +{
 +    uint8_t **p = ptr;
 +    if (min_size > SIZE_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
 +        av_freep(p);
 +        *size = 0;
 +        return;
 +    }
 +    if (!ff_fast_malloc(p, size, min_size + AV_INPUT_BUFFER_PADDING_SIZE, 1))
 +        memset(*p, 0, min_size + AV_INPUT_BUFFER_PADDING_SIZE);
  }
  
  /* encoder management */
  static AVCodec *first_avcodec = NULL;
 +static AVCodec **last_avcodec = &first_avcodec;
  
  AVCodec *av_codec_next(const AVCodec *c)
  {
@@@ -179,13 -107,12 +179,13 @@@ av_cold void avcodec_register(AVCodec *
  {
      AVCodec **p;
      avcodec_init();
 -    p = &first_avcodec;
 -    while (*p)
 -        p = &(*p)->next;
 -    *p          = codec;
 +    p = last_avcodec;
      codec->next = NULL;
  
 +    while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, codec))
 +        p = &(*p)->next;
 +    last_avcodec = &codec->next;
 +
      if (codec->init_static_data)
          codec->init_static_data(codec);
  }
@@@ -200,24 -127,18 +200,24 @@@ unsigned avcodec_get_edge_width(void
  #if FF_API_SET_DIMENSIONS
  void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
  {
 -    ff_set_dimensions(s, width, height);
 +    int ret = ff_set_dimensions(s, width, height);
 +    if (ret < 0) {
 +        av_log(s, AV_LOG_WARNING, "Failed to set dimensions %d %d\n", width, height);
 +    }
  }
  #endif
  
  int ff_set_dimensions(AVCodecContext *s, int width, int height)
  {
 -    int ret = av_image_check_size(width, height, 0, s);
 +    int ret = av_image_check_size2(width, height, s->max_pixels, AV_PIX_FMT_NONE, 0, s);
  
      if (ret < 0)
          width = height = 0;
 -    s->width  = s->coded_width  = width;
 -    s->height = s->coded_height = height;
 +
 +    s->coded_width  = width;
 +    s->coded_height = height;
 +    s->width        = AV_CEIL_RSHIFT(width,  s->lowres);
 +    s->height       = AV_CEIL_RSHIFT(height, s->lowres);
  
      return ret;
  }
@@@ -257,18 -178,20 +257,18 @@@ int ff_side_data_update_matrix_encoding
      return 0;
  }
  
 -#if HAVE_SIMD_ALIGN_32
 -#   define STRIDE_ALIGN 32
 -#elif HAVE_SIMD_ALIGN_16
 -#   define STRIDE_ALIGN 16
 -#else
 -#   define STRIDE_ALIGN 8
 -#endif
 -
  void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
                                 int linesize_align[AV_NUM_DATA_POINTERS])
  {
      int i;
      int w_align = 1;
      int h_align = 1;
 +    AVPixFmtDescriptor const *desc = av_pix_fmt_desc_get(s->pix_fmt);
 +
 +    if (desc) {
 +        w_align = 1 << desc->log2_chroma_w;
 +        h_align = 1 << desc->log2_chroma_h;
 +    }
  
      switch (s->pix_fmt) {
      case AV_PIX_FMT_YUV420P:
      case AV_PIX_FMT_YUV420P9BE:
      case AV_PIX_FMT_YUV420P10LE:
      case AV_PIX_FMT_YUV420P10BE:
 +    case AV_PIX_FMT_YUV420P12LE:
 +    case AV_PIX_FMT_YUV420P12BE:
 +    case AV_PIX_FMT_YUV420P14LE:
 +    case AV_PIX_FMT_YUV420P14BE:
 +    case AV_PIX_FMT_YUV420P16LE:
 +    case AV_PIX_FMT_YUV420P16BE:
 +    case AV_PIX_FMT_YUVA420P9LE:
 +    case AV_PIX_FMT_YUVA420P9BE:
 +    case AV_PIX_FMT_YUVA420P10LE:
 +    case AV_PIX_FMT_YUVA420P10BE:
 +    case AV_PIX_FMT_YUVA420P16LE:
 +    case AV_PIX_FMT_YUVA420P16BE:
      case AV_PIX_FMT_YUV422P9LE:
      case AV_PIX_FMT_YUV422P9BE:
      case AV_PIX_FMT_YUV422P10LE:
      case AV_PIX_FMT_YUV422P10BE:
 +    case AV_PIX_FMT_YUV422P12LE:
 +    case AV_PIX_FMT_YUV422P12BE:
 +    case AV_PIX_FMT_YUV422P14LE:
 +    case AV_PIX_FMT_YUV422P14BE:
 +    case AV_PIX_FMT_YUV422P16LE:
 +    case AV_PIX_FMT_YUV422P16BE:
 +    case AV_PIX_FMT_YUVA422P9LE:
 +    case AV_PIX_FMT_YUVA422P9BE:
      case AV_PIX_FMT_YUVA422P10LE:
      case AV_PIX_FMT_YUVA422P10BE:
 +    case AV_PIX_FMT_YUVA422P16LE:
 +    case AV_PIX_FMT_YUVA422P16BE:
 +    case AV_PIX_FMT_YUV440P10LE:
 +    case AV_PIX_FMT_YUV440P10BE:
 +    case AV_PIX_FMT_YUV440P12LE:
 +    case AV_PIX_FMT_YUV440P12BE:
      case AV_PIX_FMT_YUV444P9LE:
      case AV_PIX_FMT_YUV444P9BE:
      case AV_PIX_FMT_YUV444P10LE:
      case AV_PIX_FMT_YUV444P10BE:
 +    case AV_PIX_FMT_YUV444P12LE:
 +    case AV_PIX_FMT_YUV444P12BE:
 +    case AV_PIX_FMT_YUV444P14LE:
 +    case AV_PIX_FMT_YUV444P14BE:
 +    case AV_PIX_FMT_YUV444P16LE:
 +    case AV_PIX_FMT_YUV444P16BE:
 +    case AV_PIX_FMT_YUVA444P9LE:
 +    case AV_PIX_FMT_YUVA444P9BE:
      case AV_PIX_FMT_YUVA444P10LE:
      case AV_PIX_FMT_YUVA444P10BE:
 +    case AV_PIX_FMT_YUVA444P16LE:
 +    case AV_PIX_FMT_YUVA444P16BE:
      case AV_PIX_FMT_GBRP9LE:
      case AV_PIX_FMT_GBRP9BE:
      case AV_PIX_FMT_GBRP10LE:
      case AV_PIX_FMT_GBRP10BE:
 +    case AV_PIX_FMT_GBRP12LE:
 +    case AV_PIX_FMT_GBRP12BE:
 +    case AV_PIX_FMT_GBRP14LE:
 +    case AV_PIX_FMT_GBRP14BE:
 +    case AV_PIX_FMT_GBRP16LE:
 +    case AV_PIX_FMT_GBRP16BE:
      case AV_PIX_FMT_GBRAP12LE:
      case AV_PIX_FMT_GBRAP12BE:
 +    case AV_PIX_FMT_GBRAP16LE:
 +    case AV_PIX_FMT_GBRAP16BE:
          w_align = 16; //FIXME assume 16 pixel per macroblock
          h_align = 16 * 2; // interlaced needs 2 macroblocks height
          break;
      case AV_PIX_FMT_YUV411P:
 +    case AV_PIX_FMT_YUVJ411P:
      case AV_PIX_FMT_UYYVYY411:
          w_align = 32;
 -        h_align = 8;
 +        h_align = 16 * 2;
          break;
      case AV_PIX_FMT_YUV410P:
          if (s->codec_id == AV_CODEC_ID_SVQ1) {
              w_align = 64;
              h_align = 64;
          }
 +        break;
      case AV_PIX_FMT_RGB555:
          if (s->codec_id == AV_CODEC_ID_RPZA) {
              w_align = 4;
              h_align = 4;
          }
 +        if (s->codec_id == AV_CODEC_ID_INTERPLAY_VIDEO) {
 +            w_align = 8;
 +            h_align = 8;
 +        }
 +        break;
      case AV_PIX_FMT_PAL8:
      case AV_PIX_FMT_BGR8:
      case AV_PIX_FMT_RGB8:
 -        if (s->codec_id == AV_CODEC_ID_SMC) {
 +        if (s->codec_id == AV_CODEC_ID_SMC ||
 +            s->codec_id == AV_CODEC_ID_CINEPAK) {
              w_align = 4;
              h_align = 4;
          }
 +        if (s->codec_id == AV_CODEC_ID_JV ||
 +            s->codec_id == AV_CODEC_ID_INTERPLAY_VIDEO) {
 +            w_align = 8;
 +            h_align = 8;
 +        }
          break;
      case AV_PIX_FMT_BGR24:
          if ((s->codec_id == AV_CODEC_ID_MSZH) ||
              h_align = 4;
          }
          break;
 +    case AV_PIX_FMT_RGB24:
 +        if (s->codec_id == AV_CODEC_ID_CINEPAK) {
 +            w_align = 4;
 +            h_align = 4;
 +        }
 +        break;
      default:
 -        w_align = 1;
 -        h_align = 1;
          break;
      }
  
 +    if (s->codec_id == AV_CODEC_ID_IFF_ILBM) {
 +        w_align = FFMAX(w_align, 8);
 +    }
 +
      *width  = FFALIGN(*width, w_align);
      *height = FFALIGN(*height, h_align);
 -    if (s->codec_id == AV_CODEC_ID_H264)
 +    if (s->codec_id == AV_CODEC_ID_H264 || s->lowres) {
          // some of the optimized chroma MC reads one line too much
 +        // which is also done in mpeg decoders with lowres > 0
          *height += 2;
  
 +        // H.264 uses edge emulation for out of frame motion vectors, for this
 +        // it requires a temporary area large enough to hold a 21x21 block,
 +        // increasing witdth ensure that the temporary area is large enough,
 +        // the next rounded up width is 32
 +        *width = FFMAX(*width, 32);
 +    }
 +
      for (i = 0; i < 4; i++)
          linesize_align[i] = STRIDE_ALIGN;
  }
@@@ -449,29 -299,6 +449,29 @@@ void avcodec_align_dimensions(AVCodecCo
      *width              = FFALIGN(*width, align);
  }
  
 +int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos)
 +{
 +    if (pos <= AVCHROMA_LOC_UNSPECIFIED || pos >= AVCHROMA_LOC_NB)
 +        return AVERROR(EINVAL);
 +    pos--;
 +
 +    *xpos = (pos&1) * 128;
 +    *ypos = ((pos>>1)^(pos<4)) * 128;
 +
 +    return 0;
 +}
 +
 +enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos)
 +{
 +    int pos, xout, yout;
 +
 +    for (pos = AVCHROMA_LOC_UNSPECIFIED + 1; pos < AVCHROMA_LOC_NB; pos++) {
 +        if (avcodec_enum_to_chroma_pos(&xout, &yout, pos) == 0 && xout == xpos && yout == ypos)
 +            return pos;
 +    }
 +    return AVCHROMA_LOC_UNSPECIFIED;
 +}
 +
  int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
                               enum AVSampleFormat sample_fmt, const uint8_t *buf,
                               int buf_size, int align)
  
      planar = av_sample_fmt_is_planar(sample_fmt);
      if (planar && nb_channels > AV_NUM_DATA_POINTERS) {
 -        if (!(frame->extended_data = av_mallocz(nb_channels *
 +        if (!(frame->extended_data = av_mallocz_array(nb_channels,
                                                  sizeof(*frame->extended_data))))
              return AVERROR(ENOMEM);
      } else {
      }
  
      if ((ret = av_samples_fill_arrays(frame->extended_data, &frame->linesize[0],
 -                                      buf, nb_channels, frame->nb_samples,
 +                                      (uint8_t *)(intptr_t)buf, nb_channels, frame->nb_samples,
                                        sample_fmt, align)) < 0) {
          if (frame->extended_data != frame->data)
 -            av_free(frame->extended_data);
 +            av_freep(&frame->extended_data);
          return ret;
      }
      if (frame->extended_data != frame->data) {
@@@ -531,9 -358,7 +531,9 @@@ static int update_frame_pool(AVCodecCon
          do {
              // NOTE: do not align linesizes individually, this breaks e.g. assumptions
              // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2
 -            av_image_fill_linesizes(linesize, avctx->pix_fmt, w);
 +            ret = av_image_fill_linesizes(linesize, avctx->pix_fmt, w);
 +            if (ret < 0)
 +                return ret;
              // increase alignment of w for next try (rhs gives the lowest bit set in w)
              w += w & ~(w - 1);
  
              av_buffer_pool_uninit(&pool->pools[i]);
              pool->linesize[i] = linesize[i];
              if (size[i]) {
 -                pool->pools[i] = av_buffer_pool_init(size[i] + 16, NULL);
 +                pool->pools[i] = av_buffer_pool_init(size[i] + 16 + STRIDE_ALIGN - 1,
 +                                                     CONFIG_MEMORY_POISONING ?
 +                                                        NULL :
 +                                                        av_buffer_allocz);
                  if (!pool->pools[i]) {
                      ret = AVERROR(ENOMEM);
                      goto fail;
          break;
          }
      case AVMEDIA_TYPE_AUDIO: {
 -        int ch     = av_get_channel_layout_nb_channels(frame->channel_layout);
 +        int ch     = av_frame_get_channels(frame); //av_get_channel_layout_nb_channels(frame->channel_layout);
          int planar = av_sample_fmt_is_planar(frame->format);
          int planes = planar ? ch : 1;
  
@@@ -619,19 -441,17 +619,19 @@@ static int audio_get_buffer(AVCodecCont
      frame->linesize[0] = pool->linesize[0];
  
      if (planes > AV_NUM_DATA_POINTERS) {
 -        frame->extended_data = av_mallocz(planes * sizeof(*frame->extended_data));
 +        frame->extended_data = av_mallocz_array(planes, sizeof(*frame->extended_data));
          frame->nb_extended_buf = planes - AV_NUM_DATA_POINTERS;
 -        frame->extended_buf  = av_mallocz(frame->nb_extended_buf *
 +        frame->extended_buf  = av_mallocz_array(frame->nb_extended_buf,
                                            sizeof(*frame->extended_buf));
          if (!frame->extended_data || !frame->extended_buf) {
              av_freep(&frame->extended_data);
              av_freep(&frame->extended_buf);
              return AVERROR(ENOMEM);
          }
 -    } else
 +    } else {
          frame->extended_data = frame->data;
 +        av_assert0(frame->nb_extended_buf == 0);
 +    }
  
      for (i = 0; i < FFMIN(planes, AV_NUM_DATA_POINTERS); i++) {
          frame->buf[i] = av_buffer_pool_get(pool->pools[0]);
@@@ -658,21 -478,13 +658,21 @@@ fail
  static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
  {
      FramePool *pool = s->internal->pool;
 +    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pic->format);
      int i;
  
 -    if (pic->data[0]) {
 -        av_log(s, AV_LOG_ERROR, "pic->data[0]!=NULL in avcodec_default_get_buffer\n");
 +    if (pic->data[0] || pic->data[1] || pic->data[2] || pic->data[3]) {
 +        av_log(s, AV_LOG_ERROR, "pic->data[*]!=NULL in avcodec_default_get_buffer\n");
          return -1;
      }
  
 +    if (!desc) {
 +        av_log(s, AV_LOG_ERROR,
 +            "Unable to get pixel format descriptor for format %s\n",
 +            av_get_pix_fmt_name(pic->format));
 +        return AVERROR(EINVAL);
 +    }
 +
      memset(pic->data, 0, sizeof(pic->data));
      pic->extended_data = pic->data;
  
          pic->data[i] = NULL;
          pic->linesize[i] = 0;
      }
 -    if (pic->data[1] && !pic->data[2])
 -        avpriv_set_systematic_pal2((uint32_t *)pic->data[1], s->pix_fmt);
 +    if (desc->flags & AV_PIX_FMT_FLAG_PAL ||
 +        desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL)
 +        avpriv_set_systematic_pal2((uint32_t *)pic->data[1], pic->format);
  
      if (s->debug & FF_DEBUG_BUFFERS)
          av_log(s, AV_LOG_DEBUG, "default_get_buffer called on pic %p\n", pic);
@@@ -702,29 -513,6 +702,29 @@@ fail
      return AVERROR(ENOMEM);
  }
  
 +void ff_color_frame(AVFrame *frame, const int c[4])
 +{
 +    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
 +    int p, y, x;
 +
 +    av_assert0(desc->flags & AV_PIX_FMT_FLAG_PLANAR);
 +
 +    for (p = 0; p<desc->nb_components; p++) {
 +        uint8_t *dst = frame->data[p];
 +        int is_chroma = p == 1 || p == 2;
 +        int bytes  = is_chroma ? AV_CEIL_RSHIFT(frame->width,  desc->log2_chroma_w) : frame->width;
 +        int height = is_chroma ? AV_CEIL_RSHIFT(frame->height, desc->log2_chroma_h) : frame->height;
 +        for (y = 0; y < height; y++) {
 +            if (desc->comp[0].depth >= 9) {
 +                for (x = 0; x<bytes; x++)
 +                    ((uint16_t*)dst)[x] = c[p];
 +            }else
 +                memset(dst, c[p], bytes);
 +            dst += frame->linesize[p];
 +        }
 +    }
 +}
 +
  int avcodec_default_get_buffer2(AVCodecContext *avctx, AVFrame *frame, int flags)
  {
      int ret;
      }
  }
  
 -int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
 +static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
  {
 -    AVPacket *pkt = avctx->internal->pkt;
 +    int size;
 +    const uint8_t *side_metadata;
 +
 +    AVDictionary **frame_md = avpriv_frame_get_metadatap(frame);
 +
 +    side_metadata = av_packet_get_side_data(avpkt,
 +                                            AV_PKT_DATA_STRINGS_METADATA, &size);
 +    return av_packet_unpack_dictionary(side_metadata, size, frame_md);
 +}
 +
 +int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame)
 +{
 +    const AVPacket *pkt = avctx->internal->pkt;
      int i;
 -    struct {
 +    static const struct {
          enum AVPacketSideDataType packet;
          enum AVFrameSideDataType frame;
      } sd[] = {
 -        { AV_PKT_DATA_REPLAYGAIN ,   AV_FRAME_DATA_REPLAYGAIN },
 -        { AV_PKT_DATA_DISPLAYMATRIX, AV_FRAME_DATA_DISPLAYMATRIX },
 -        { AV_PKT_DATA_STEREO3D,      AV_FRAME_DATA_STEREO3D },
 -        { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
 +        { AV_PKT_DATA_REPLAYGAIN ,                AV_FRAME_DATA_REPLAYGAIN },
 +        { AV_PKT_DATA_DISPLAYMATRIX,              AV_FRAME_DATA_DISPLAYMATRIX },
 +        { AV_PKT_DATA_SPHERICAL,                  AV_FRAME_DATA_SPHERICAL },
 +        { AV_PKT_DATA_STEREO3D,                   AV_FRAME_DATA_STEREO3D },
 +        { AV_PKT_DATA_AUDIO_SERVICE_TYPE,         AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
 +        { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA },
 +        { AV_PKT_DATA_CONTENT_LIGHT_LEVEL,        AV_FRAME_DATA_CONTENT_LIGHT_LEVEL },
      };
  
 -    frame->color_primaries = avctx->color_primaries;
 -    frame->color_trc       = avctx->color_trc;
 -    frame->colorspace      = avctx->colorspace;
 -    frame->color_range     = avctx->color_range;
 -    frame->chroma_location = avctx->chroma_sample_location;
 -
 -    frame->reordered_opaque = avctx->reordered_opaque;
 -    if (!pkt) {
 +    if (pkt) {
 +        frame->pts = pkt->pts;
  #if FF_API_PKT_PTS
  FF_DISABLE_DEPRECATION_WARNINGS
 -        frame->pkt_pts = AV_NOPTS_VALUE;
 +        frame->pkt_pts = pkt->pts;
  FF_ENABLE_DEPRECATION_WARNINGS
  #endif
 -        frame->pts     = AV_NOPTS_VALUE;
 -        return 0;
 -    }
 +        av_frame_set_pkt_pos     (frame, pkt->pos);
 +        av_frame_set_pkt_duration(frame, pkt->duration);
 +        av_frame_set_pkt_size    (frame, pkt->size);
 +
 +        for (i = 0; i < FF_ARRAY_ELEMS(sd); i++) {
 +            int size;
 +            uint8_t *packet_sd = av_packet_get_side_data(pkt, sd[i].packet, &size);
 +            if (packet_sd) {
 +                AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
 +                                                                   sd[i].frame,
 +                                                                   size);
 +                if (!frame_sd)
 +                    return AVERROR(ENOMEM);
 +
 +                memcpy(frame_sd->data, packet_sd, size);
 +            }
 +        }
 +        add_metadata_from_side_data(pkt, frame);
  
 +        if (pkt->flags & AV_PKT_FLAG_DISCARD) {
 +            frame->flags |= AV_FRAME_FLAG_DISCARD;
 +        } else {
 +            frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
 +        }
 +    } else {
 +        frame->pts = AV_NOPTS_VALUE;
  #if FF_API_PKT_PTS
  FF_DISABLE_DEPRECATION_WARNINGS
 -    frame->pkt_pts = pkt->pts;
 +        frame->pkt_pts = AV_NOPTS_VALUE;
  FF_ENABLE_DEPRECATION_WARNINGS
  #endif
 -    frame->pts     = pkt->pts;
 -
 -    for (i = 0; i < FF_ARRAY_ELEMS(sd); i++) {
 -        int size;
 -        uint8_t *packet_sd = av_packet_get_side_data(pkt, sd[i].packet, &size);
 -        if (packet_sd) {
 -            AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
 -                                                               sd[i].frame,
 -                                                               size);
 -            if (!frame_sd)
 -                return AVERROR(ENOMEM);
 -
 -            memcpy(frame_sd->data, packet_sd, size);
 -        }
 +        av_frame_set_pkt_pos     (frame, -1);
 +        av_frame_set_pkt_duration(frame, 0);
 +        av_frame_set_pkt_size    (frame, -1);
      }
 +    frame->reordered_opaque = avctx->reordered_opaque;
  
 -    return 0;
 -}
 -
 -int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
 -{
 -    const AVHWAccel *hwaccel = avctx->hwaccel;
 -    int override_dimensions = 1;
 -    int ret;
 -
 -    switch (avctx->codec_type) {
 +    if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED)
 +        frame->color_primaries = avctx->color_primaries;
 +    if (frame->color_trc == AVCOL_TRC_UNSPECIFIED)
 +        frame->color_trc = avctx->color_trc;
 +    if (av_frame_get_colorspace(frame) == AVCOL_SPC_UNSPECIFIED)
 +        av_frame_set_colorspace(frame, avctx->colorspace);
 +    if (av_frame_get_color_range(frame) == AVCOL_RANGE_UNSPECIFIED)
 +        av_frame_set_color_range(frame, avctx->color_range);
 +    if (frame->chroma_location == AVCHROMA_LOC_UNSPECIFIED)
 +        frame->chroma_location = avctx->chroma_sample_location;
 +
 +    switch (avctx->codec->type) {
      case AVMEDIA_TYPE_VIDEO:
 -        if (frame->width <= 0 || frame->height <= 0) {
 -            frame->width  = FFMAX(avctx->width, avctx->coded_width);
 -            frame->height = FFMAX(avctx->height, avctx->coded_height);
 -            override_dimensions = 0;
 -        }
 -        if (frame->format < 0)
 -            frame->format              = avctx->pix_fmt;
 +        frame->format              = avctx->pix_fmt;
          if (!frame->sample_aspect_ratio.num)
              frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
  
 -        if (av_image_check_sar(frame->width, frame->height,
 +        if (frame->width && frame->height &&
 +            av_image_check_sar(frame->width, frame->height,
                                 frame->sample_aspect_ratio) < 0) {
              av_log(avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n",
                     frame->sample_aspect_ratio.num,
              frame->sample_aspect_ratio = (AVRational){ 0, 1 };
          }
  
 -        if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
 -            return ret;
          break;
      case AVMEDIA_TYPE_AUDIO:
          if (!frame->sample_rate)
                             avctx->channels);
                      return AVERROR(ENOSYS);
                  }
 -
 -                frame->channel_layout = av_get_default_channel_layout(avctx->channels);
 -                if (!frame->channel_layout)
 -                    frame->channel_layout = (1ULL << avctx->channels) - 1;
              }
          }
 +        av_frame_set_channels(frame, avctx->channels);
          break;
 -    default: return AVERROR(EINVAL);
      }
 +    return 0;
 +}
 +
 +int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
 +{
 +    return ff_init_buffer_info(avctx, frame);
 +}
 +
 +static void validate_avframe_allocation(AVCodecContext *avctx, AVFrame *frame)
 +{
 +    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
 +        int i;
 +        int num_planes = av_pix_fmt_count_planes(frame->format);
 +        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
 +        int flags = desc ? desc->flags : 0;
 +        if (num_planes == 1 && (flags & AV_PIX_FMT_FLAG_PAL))
 +            num_planes = 2;
 +        for (i = 0; i < num_planes; i++) {
 +            av_assert0(frame->data[i]);
 +        }
 +        // For now do not enforce anything for palette of pseudopal formats
 +        if (num_planes == 1 && (flags & AV_PIX_FMT_FLAG_PSEUDOPAL))
 +            num_planes = 2;
 +        // For formats without data like hwaccel allow unused pointers to be non-NULL.
 +        for (i = num_planes; num_planes > 0 && i < FF_ARRAY_ELEMS(frame->data); i++) {
 +            if (frame->data[i])
 +                av_log(avctx, AV_LOG_ERROR, "Buffer returned by get_buffer2() did not zero unused plane pointers\n");
 +            frame->data[i] = NULL;
 +        }
 +    }
 +}
  
 +static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
 +{
 +    const AVHWAccel *hwaccel = avctx->hwaccel;
 +    int override_dimensions = 1;
 +    int ret;
 +
 +    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
 +        if ((ret = av_image_check_size2(avctx->width, avctx->height, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx)) < 0 || avctx->pix_fmt<0) {
 +            av_log(avctx, AV_LOG_ERROR, "video_get_buffer: image parameters invalid\n");
 +            return AVERROR(EINVAL);
 +        }
 +
 +        if (frame->width <= 0 || frame->height <= 0) {
 +            frame->width  = FFMAX(avctx->width,  AV_CEIL_RSHIFT(avctx->coded_width,  avctx->lowres));
 +            frame->height = FFMAX(avctx->height, AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres));
 +            override_dimensions = 0;
 +        }
 +
 +        if (frame->data[0] || frame->data[1] || frame->data[2] || frame->data[3]) {
 +            av_log(avctx, AV_LOG_ERROR, "pic->data[*]!=NULL in get_buffer_internal\n");
 +            return AVERROR(EINVAL);
 +        }
 +    }
      ret = ff_decode_frame_props(avctx, frame);
      if (ret < 0)
          return ret;
          avctx->sw_pix_fmt = avctx->pix_fmt;
  
      ret = avctx->get_buffer2(avctx, frame, flags);
 +    if (ret >= 0)
 +        validate_avframe_allocation(avctx, frame);
  
  end:
      if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions) {
      return ret;
  }
  
 -int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
 +int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
 +{
 +    int ret = get_buffer_internal(avctx, frame, flags);
 +    if (ret < 0) {
 +        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +        frame->width = frame->height = 0;
 +    }
 +    return ret;
 +}
 +
 +static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame)
  {
      AVFrame *tmp;
      int ret;
  
      av_assert0(avctx->codec_type == AVMEDIA_TYPE_VIDEO);
  
 +    if (frame->data[0] && (frame->width != avctx->width || frame->height != avctx->height || frame->format != avctx->pix_fmt)) {
 +        av_log(avctx, AV_LOG_WARNING, "Picture changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s in reget buffer()\n",
 +               frame->width, frame->height, av_get_pix_fmt_name(frame->format), avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
 +        av_frame_unref(frame);
 +    }
 +
 +    ff_init_buffer_info(avctx, frame);
 +
      if (!frame->data[0])
          return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
  
      return 0;
  }
  
 +int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
 +{
 +    int ret = reget_buffer_internal(avctx, frame);
 +    if (ret < 0)
 +        av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
 +    return ret;
 +}
 +
  int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2), void *arg, int *ret, int count, int size)
  {
      int i;
          if (ret)
              ret[i] = r;
      }
 +    emms_c();
      return 0;
  }
  
@@@ -1030,21 -723,9 +1030,21 @@@ int avcodec_default_execute2(AVCodecCon
          if (ret)
              ret[i] = r;
      }
 +    emms_c();
      return 0;
  }
  
 +enum AVPixelFormat avpriv_find_pix_fmt(const PixelFormatTag *tags,
 +                                       unsigned int fourcc)
 +{
 +    while (tags->pix_fmt >= 0) {
 +        if (tags->fourcc == fourcc)
 +            return tags->pix_fmt;
 +        tags++;
 +    }
 +    return AV_PIX_FMT_NONE;
 +}
 +
  static int is_hwaccel_pix_fmt(enum AVPixelFormat pix_fmt)
  {
      const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
@@@ -1084,13 -765,6 +1084,13 @@@ static int setup_hwaccel(AVCodecContex
          return AVERROR(ENOENT);
      }
  
 +    if (hwa->capabilities & HWACCEL_CODEC_CAP_EXPERIMENTAL &&
 +        avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
 +        av_log(avctx, AV_LOG_WARNING, "Ignoring experimental hwaccel: %s\n",
 +               hwa->name);
 +        return AVERROR_PATCHWELCOME;
 +    }
 +
      if (hwa->priv_data_size) {
          avctx->internal->hwaccel_priv_data = av_mallocz(hwa->priv_data_size);
          if (!avctx->internal->hwaccel_priv_data)
@@@ -1148,10 -822,6 +1148,10 @@@ int ff_get_format(AVCodecContext *avctx
  
          if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL))
              break;
 +#if FF_API_CAP_VDPAU
 +        if (avctx->codec->capabilities&AV_CODEC_CAP_HWACCEL_VDPAU)
 +            break;
 +#endif
  
          if (avctx->hw_frames_ctx) {
              AVHWFramesContext *hw_frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
      return ret;
  }
  
 +MAKE_ACCESSORS(AVCodecContext, codec, AVRational, pkt_timebase)
 +MAKE_ACCESSORS(AVCodecContext, codec, const AVCodecDescriptor *, codec_descriptor)
 +MAKE_ACCESSORS(AVCodecContext, codec, int, lowres)
 +MAKE_ACCESSORS(AVCodecContext, codec, int, seek_preroll)
 +MAKE_ACCESSORS(AVCodecContext, codec, uint16_t*, chroma_intra_matrix)
 +
 +unsigned av_codec_get_codec_properties(const AVCodecContext *codec)
 +{
 +    return codec->properties;
 +}
 +
 +int av_codec_get_max_lowres(const AVCodec *codec)
 +{
 +    return codec->max_lowres;
 +}
 +
 +int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec){
 +    return !!(codec->caps_internal & FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM);
 +}
 +
 +static void get_subtitle_defaults(AVSubtitle *sub)
 +{
 +    memset(sub, 0, sizeof(*sub));
 +    sub->pts = AV_NOPTS_VALUE;
 +}
 +
 +static int64_t get_bit_rate(AVCodecContext *ctx)
 +{
 +    int64_t bit_rate;
 +    int bits_per_sample;
 +
 +    switch (ctx->codec_type) {
 +    case AVMEDIA_TYPE_VIDEO:
 +    case AVMEDIA_TYPE_DATA:
 +    case AVMEDIA_TYPE_SUBTITLE:
 +    case AVMEDIA_TYPE_ATTACHMENT:
 +        bit_rate = ctx->bit_rate;
 +        break;
 +    case AVMEDIA_TYPE_AUDIO:
 +        bits_per_sample = av_get_bits_per_sample(ctx->codec_id);
 +        bit_rate = bits_per_sample ? ctx->sample_rate * (int64_t)ctx->channels * bits_per_sample : ctx->bit_rate;
 +        break;
 +    default:
 +        bit_rate = 0;
 +        break;
 +    }
 +    return bit_rate;
 +}
 +
 +int attribute_align_arg ff_codec_open2_recursive(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
 +{
 +    int ret = 0;
 +
 +    ff_unlock_avcodec(codec);
 +
 +    ret = avcodec_open2(avctx, codec, options);
 +
 +    ff_lock_avcodec(avctx, codec);
 +    return ret;
 +}
 +
  int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
  {
      int ret = 0;
      AVDictionary *tmp = NULL;
 +    const AVPixFmtDescriptor *pixdesc;
  
      if (avcodec_is_open(avctx))
          return 0;
  
      if ((!codec && !avctx->codec)) {
 -        av_log(avctx, AV_LOG_ERROR, "No codec provided to avcodec_open2().\n");
 +        av_log(avctx, AV_LOG_ERROR, "No codec provided to avcodec_open2()\n");
          return AVERROR(EINVAL);
      }
      if ((codec && avctx->codec && codec != avctx->codec)) {
          av_log(avctx, AV_LOG_ERROR, "This AVCodecContext was allocated for %s, "
 -                                    "but %s passed to avcodec_open2().\n", avctx->codec->name, codec->name);
 +                                    "but %s passed to avcodec_open2()\n", avctx->codec->name, codec->name);
          return AVERROR(EINVAL);
      }
      if (!codec)
      if (options)
          av_dict_copy(&tmp, *options, 0);
  
 -    /* If there is a user-supplied mutex locking routine, call it. */
 -    if (!(codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE) && codec->init) {
 -        if (lockmgr_cb) {
 -            if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
 -                return -1;
 -        }
 -
 -        entangled_thread_counter++;
 -        if (entangled_thread_counter != 1) {
 -            av_log(avctx, AV_LOG_ERROR,
 -                   "Insufficient thread locking. At least %d threads are "
 -                   "calling avcodec_open2() at the same time right now.\n",
 -                   entangled_thread_counter);
 -            ret = -1;
 -            goto end;
 -        }
 -    }
 +    ret = ff_lock_avcodec(avctx, codec);
 +    if (ret < 0)
 +        return ret;
  
      avctx->internal = av_mallocz(sizeof(AVCodecInternal));
      if (!avctx->internal) {
          goto free_and_end;
      }
  
 +    avctx->internal->skip_samples_multiplier = 1;
 +
      if (codec->priv_data_size > 0) {
          if (!avctx->priv_data) {
              avctx->priv_data = av_mallocz(codec->priv_data_size);
      if ((ret = av_opt_set_dict(avctx, &tmp)) < 0)
          goto free_and_end;
  
 -    if (avctx->coded_width && avctx->coded_height && !avctx->width && !avctx->height)
 +    if (avctx->codec_whitelist && av_match_list(codec->name, avctx->codec_whitelist, ',') <= 0) {
 +        av_log(avctx, AV_LOG_ERROR, "Codec (%s) not on whitelist \'%s\'\n", codec->name, avctx->codec_whitelist);
 +        ret = AVERROR(EINVAL);
 +        goto free_and_end;
 +    }
 +
 +    // only call ff_set_dimensions() for non H.264/VP6F/DXV codecs so as not to overwrite previously setup dimensions
 +    if (!(avctx->coded_width && avctx->coded_height && avctx->width && avctx->height &&
 +          (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_VP6F || avctx->codec_id == AV_CODEC_ID_DXV))) {
 +    if (avctx->coded_width && avctx->coded_height)
          ret = ff_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
      else if (avctx->width && avctx->height)
          ret = ff_set_dimensions(avctx, avctx->width, avctx->height);
      if (ret < 0)
          goto free_and_end;
 +    }
  
      if ((avctx->coded_width || avctx->coded_height || avctx->width || avctx->height)
 -        && (  av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx) < 0
 -           || av_image_check_size(avctx->width,       avctx->height,       0, avctx) < 0)) {
 -        av_log(avctx, AV_LOG_WARNING, "ignoring invalid width/height values\n");
 +        && (  av_image_check_size2(avctx->coded_width, avctx->coded_height, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx) < 0
 +           || av_image_check_size2(avctx->width,       avctx->height,       avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx) < 0)) {
 +        av_log(avctx, AV_LOG_WARNING, "Ignoring invalid width/height values\n");
          ff_set_dimensions(avctx, 0, 0);
      }
  
      }
      if (avctx->codec_id != codec->id || (avctx->codec_type != codec->type
                                           && avctx->codec_type != AVMEDIA_TYPE_ATTACHMENT)) {
 -        av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n");
 +        av_log(avctx, AV_LOG_ERROR, "Codec type or id mismatches\n");
          ret = AVERROR(EINVAL);
          goto free_and_end;
      }
      avctx->frame_number = 0;
 +    avctx->codec_descriptor = avcodec_descriptor_get(avctx->codec_id);
  
      if ((avctx->codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL) &&
          avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
 +        const char *codec_string = av_codec_is_encoder(codec) ? "encoder" : "decoder";
 +        AVCodec *codec2;
 +        av_log(avctx, AV_LOG_ERROR,
 +               "The %s '%s' is experimental but experimental codecs are not enabled, "
 +               "add '-strict %d' if you want to use it.\n",
 +               codec_string, codec->name, FF_COMPLIANCE_EXPERIMENTAL);
 +        codec2 = av_codec_is_encoder(codec) ? avcodec_find_encoder(codec->id) : avcodec_find_decoder(codec->id);
 +        if (!(codec2->capabilities & AV_CODEC_CAP_EXPERIMENTAL))
 +            av_log(avctx, AV_LOG_ERROR, "Alternatively use the non experimental %s '%s'.\n",
 +                codec_string, codec2->name);
          ret = AVERROR_EXPERIMENTAL;
          goto free_and_end;
      }
          avctx->time_base.den = avctx->sample_rate;
      }
  
 -    if (HAVE_THREADS) {
 +    if (!HAVE_THREADS)
 +        av_log(avctx, AV_LOG_WARNING, "Warning: not compiled with thread support, using thread emulation\n");
 +
 +    if (CONFIG_FRAME_THREAD_ENCODER && av_codec_is_encoder(avctx->codec)) {
 +        ff_unlock_avcodec(codec); //we will instantiate a few encoders thus kick the counter to prevent false detection of a problem
 +        ret = ff_frame_thread_encoder_init(avctx, options ? *options : NULL);
 +        ff_lock_avcodec(avctx, codec);
 +        if (ret < 0)
 +            goto free_and_end;
 +    }
 +
 +    if (HAVE_THREADS
 +        && !(avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))) {
          ret = ff_thread_init(avctx);
          if (ret < 0) {
              goto free_and_end;
      if (!HAVE_THREADS && !(codec->capabilities & AV_CODEC_CAP_AUTO_THREADS))
          avctx->thread_count = 1;
  
 +    if (avctx->codec->max_lowres < avctx->lowres || avctx->lowres < 0) {
 +        av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
 +               avctx->codec->max_lowres);
 +        avctx->lowres = avctx->codec->max_lowres;
 +    }
 +
 +#if FF_API_VISMV
 +    if (avctx->debug_mv)
 +        av_log(avctx, AV_LOG_WARNING, "The 'vismv' option is deprecated, "
 +               "see the codecview filter instead.\n");
 +#endif
 +
      if (av_codec_is_encoder(avctx->codec)) {
          int i;
  #if FF_API_CODED_FRAME
@@@ -1467,10 -1042,7 +1467,10 @@@ FF_ENABLE_DEPRECATION_WARNING
                  }
              }
              if (avctx->codec->sample_fmts[i] == AV_SAMPLE_FMT_NONE) {
 -                av_log(avctx, AV_LOG_ERROR, "Specified sample_fmt is not supported.\n");
 +                char buf[128];
 +                snprintf(buf, sizeof(buf), "%d", avctx->sample_fmt);
 +                av_log(avctx, AV_LOG_ERROR, "Specified sample format %s is invalid or not supported\n",
 +                       (char *)av_x_if_null(av_get_sample_fmt_name(avctx->sample_fmt), buf));
                  ret = AVERROR(EINVAL);
                  goto free_and_end;
              }
              for (i = 0; avctx->codec->pix_fmts[i] != AV_PIX_FMT_NONE; i++)
                  if (avctx->pix_fmt == avctx->codec->pix_fmts[i])
                      break;
 -            if (avctx->codec->pix_fmts[i] == AV_PIX_FMT_NONE) {
 -                av_log(avctx, AV_LOG_ERROR, "Specified pix_fmt is not supported\n");
 +            if (avctx->codec->pix_fmts[i] == AV_PIX_FMT_NONE
 +                && !((avctx->codec_id == AV_CODEC_ID_MJPEG || avctx->codec_id == AV_CODEC_ID_LJPEG)
 +                     && avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL)) {
 +                char buf[128];
 +                snprintf(buf, sizeof(buf), "%d", avctx->pix_fmt);
 +                av_log(avctx, AV_LOG_ERROR, "Specified pixel format %s is invalid or not supported\n",
 +                       (char *)av_x_if_null(av_get_pix_fmt_name(avctx->pix_fmt), buf));
                  ret = AVERROR(EINVAL);
                  goto free_and_end;
              }
              if (avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ420P ||
 +                avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ411P ||
                  avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ422P ||
                  avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ440P ||
                  avctx->codec->pix_fmts[i] == AV_PIX_FMT_YUVJ444P)
                  if (avctx->sample_rate == avctx->codec->supported_samplerates[i])
                      break;
              if (avctx->codec->supported_samplerates[i] == 0) {
 -                av_log(avctx, AV_LOG_ERROR, "Specified sample_rate is not supported\n");
 +                av_log(avctx, AV_LOG_ERROR, "Specified sample rate %d is not supported\n",
 +                       avctx->sample_rate);
                  ret = AVERROR(EINVAL);
                  goto free_and_end;
              }
          }
 +        if (avctx->sample_rate < 0) {
 +            av_log(avctx, AV_LOG_ERROR, "Specified sample rate %d is not supported\n",
 +                    avctx->sample_rate);
 +            ret = AVERROR(EINVAL);
 +            goto free_and_end;
 +        }
          if (avctx->codec->channel_layouts) {
              if (!avctx->channel_layout) {
 -                av_log(avctx, AV_LOG_WARNING, "channel_layout not specified\n");
 +                av_log(avctx, AV_LOG_WARNING, "Channel layout not specified\n");
              } else {
                  for (i = 0; avctx->codec->channel_layouts[i] != 0; i++)
                      if (avctx->channel_layout == avctx->codec->channel_layouts[i])
                          break;
                  if (avctx->codec->channel_layouts[i] == 0) {
 -                    av_log(avctx, AV_LOG_ERROR, "Specified channel_layout is not supported\n");
 +                    char buf[512];
 +                    av_get_channel_layout_string(buf, sizeof(buf), -1, avctx->channel_layout);
 +                    av_log(avctx, AV_LOG_ERROR, "Specified channel layout '%s' is not supported\n", buf);
                      ret = AVERROR(EINVAL);
                      goto free_and_end;
                  }
              }
          }
          if (avctx->channel_layout && avctx->channels) {
 -            if (av_get_channel_layout_nb_channels(avctx->channel_layout) != avctx->channels) {
 -                av_log(avctx, AV_LOG_ERROR, "channel layout does not match number of channels\n");
 +            int channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
 +            if (channels != avctx->channels) {
 +                char buf[512];
 +                av_get_channel_layout_string(buf, sizeof(buf), -1, avctx->channel_layout);
 +                av_log(avctx, AV_LOG_ERROR,
 +                       "Channel layout '%s' with %d channels does not match number of specified channels %d\n",
 +                       buf, channels, avctx->channels);
                  ret = AVERROR(EINVAL);
                  goto free_and_end;
              }
          } else if (avctx->channel_layout) {
              avctx->channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
          }
 +        if (avctx->channels < 0) {
 +            av_log(avctx, AV_LOG_ERROR, "Specified number of channels %d is not supported\n",
 +                    avctx->channels);
 +            ret = AVERROR(EINVAL);
 +            goto free_and_end;
 +        }
 +        if(avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
 +            pixdesc = av_pix_fmt_desc_get(avctx->pix_fmt);
 +            if (    avctx->bits_per_raw_sample < 0
 +                || (avctx->bits_per_raw_sample > 8 && pixdesc->comp[0].depth <= 8)) {
 +                av_log(avctx, AV_LOG_WARNING, "Specified bit depth %d not possible with the specified pixel formats depth %d\n",
 +                    avctx->bits_per_raw_sample, pixdesc->comp[0].depth);
 +                avctx->bits_per_raw_sample = pixdesc->comp[0].depth;
 +            }
 +            if (avctx->width <= 0 || avctx->height <= 0) {
 +                av_log(avctx, AV_LOG_ERROR, "dimensions not set\n");
 +                ret = AVERROR(EINVAL);
 +                goto free_and_end;
 +            }
 +        }
 +        if (   (avctx->codec_type == AVMEDIA_TYPE_VIDEO || avctx->codec_type == AVMEDIA_TYPE_AUDIO)
 +            && avctx->bit_rate>0 && avctx->bit_rate<1000) {
 +            av_log(avctx, AV_LOG_WARNING, "Bitrate %"PRId64" is extremely low, maybe you mean %"PRId64"k\n", (int64_t)avctx->bit_rate, (int64_t)avctx->bit_rate);
 +        }
  
          if (!avctx->rc_initial_buffer_occupancy)
              avctx->rc_initial_buffer_occupancy = avctx->rc_buffer_size * 3 / 4;
  
 -        if (avctx->ticks_per_frame &&
 +        if (avctx->ticks_per_frame && avctx->time_base.num &&
              avctx->ticks_per_frame > INT_MAX / avctx->time_base.num) {
              av_log(avctx, AV_LOG_ERROR,
                     "ticks_per_frame %d too large for the timebase %d/%d.",
          }
      }
  
 -    if (avctx->codec->init && !(avctx->active_thread_type & FF_THREAD_FRAME)) {
 +    avctx->pts_correction_num_faulty_pts =
 +    avctx->pts_correction_num_faulty_dts = 0;
 +    avctx->pts_correction_last_pts =
 +    avctx->pts_correction_last_dts = INT64_MIN;
 +
 +    if (   !CONFIG_GRAY && avctx->flags & AV_CODEC_FLAG_GRAY
 +        && avctx->codec_descriptor->type == AVMEDIA_TYPE_VIDEO)
 +        av_log(avctx, AV_LOG_WARNING,
 +               "gray decoding requested but not enabled at configuration time\n");
 +
 +    if (   avctx->codec->init && (!(avctx->active_thread_type&FF_THREAD_FRAME)
 +        || avctx->internal->frame_thread_encoder)) {
          ret = avctx->codec->init(avctx);
          if (ret < 0) {
              goto free_and_end;
          }
      }
  
 +    ret=0;
 +
  #if FF_API_AUDIOENC_DELAY
      if (av_codec_is_encoder(avctx->codec))
          avctx->delay = avctx->initial_padding;
  #endif
  
      if (av_codec_is_decoder(avctx->codec)) {
 +        if (!avctx->bit_rate)
 +            avctx->bit_rate = get_bit_rate(avctx);
          /* validate channel layout from the decoder */
          if (avctx->channel_layout) {
              int channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
              if (!avctx->channels)
                  avctx->channels = channels;
              else if (channels != avctx->channels) {
 +                char buf[512];
 +                av_get_channel_layout_string(buf, sizeof(buf), -1, avctx->channel_layout);
                  av_log(avctx, AV_LOG_WARNING,
 -                       "channel layout does not match number of channels\n");
 +                       "Channel layout '%s' with %d channels does not match specified number of channels %d: "
 +                       "ignoring specified channel layout\n",
 +                       buf, channels, avctx->channels);
                  avctx->channel_layout = 0;
              }
          }
              ret = AVERROR(EINVAL);
              goto free_and_end;
          }
 +        if (avctx->sub_charenc) {
 +            if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
 +                av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
 +                       "supported with subtitles codecs\n");
 +                ret = AVERROR(EINVAL);
 +                goto free_and_end;
 +            } else if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) {
 +                av_log(avctx, AV_LOG_WARNING, "Codec '%s' is bitmap-based, "
 +                       "subtitles character encoding will be ignored\n",
 +                       avctx->codec_descriptor->name);
 +                avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_DO_NOTHING;
 +            } else {
 +                /* input character encoding is set for a text based subtitle
 +                 * codec at this point */
 +                if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_AUTOMATIC)
 +                    avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_PRE_DECODER;
 +
 +                if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_PRE_DECODER) {
 +#if CONFIG_ICONV
 +                    iconv_t cd = iconv_open("UTF-8", avctx->sub_charenc);
 +                    if (cd == (iconv_t)-1) {
 +                        ret = AVERROR(errno);
 +                        av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
 +                               "with input character encoding \"%s\"\n", avctx->sub_charenc);
 +                        goto free_and_end;
 +                    }
 +                    iconv_close(cd);
 +#else
 +                    av_log(avctx, AV_LOG_ERROR, "Character encoding subtitles "
 +                           "conversion needs a libavcodec built with iconv support "
 +                           "for this codec\n");
 +                    ret = AVERROR(ENOSYS);
 +                    goto free_and_end;
 +#endif
 +                }
 +            }
 +        }
  
  #if FF_API_AVCTX_TIMEBASE
          if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
 -            avctx->time_base = av_inv_q(avctx->framerate);
 +            avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
  #endif
      }
 -end:
 -    if (!(codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE) && codec->init) {
 -        entangled_thread_counter--;
 -
 -        /* Release any user-supplied mutex. */
 -        if (lockmgr_cb) {
 -            (*lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
 -        }
 +    if (codec->priv_data_size > 0 && avctx->priv_data && codec->priv_class) {
 +        av_assert0(*(const AVClass **)avctx->priv_data == codec->priv_class);
      }
  
 +end:
 +    ff_unlock_avcodec(codec);
      if (options) {
          av_dict_free(options);
          *options = tmp;
@@@ -1711,7 -1187,7 +1711,7 @@@ free_and_end
          (avctx->codec->caps_internal & FF_CODEC_CAP_INIT_CLEANUP))
          avctx->codec->close(avctx);
  
 -    if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)
 +    if (codec->priv_class && codec->priv_data_size)
          av_opt_free(avctx->priv_data);
      av_opt_free(avctx);
  
@@@ -1734,379 -1210,11 +1734,48 @@@ FF_ENABLE_DEPRECATION_WARNING
      goto end;
  }
  
- int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
- {
-     if (avpkt->size < 0) {
-         av_log(avctx, AV_LOG_ERROR, "Invalid negative user packet size %d\n", avpkt->size);
-         return AVERROR(EINVAL);
-     }
-     if (size < 0 || size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
-         av_log(avctx, AV_LOG_ERROR, "Invalid minimum required packet size %"PRId64" (max allowed is %d)\n",
-                size, INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE);
-         return AVERROR(EINVAL);
-     }
-     if (avctx && 2*min_size < size) { // FIXME The factor needs to be finetuned
-         av_assert0(!avpkt->data || avpkt->data != avctx->internal->byte_buffer);
-         if (!avpkt->data || avpkt->size < size) {
-             av_fast_padded_malloc(&avctx->internal->byte_buffer, &avctx->internal->byte_buffer_size, size);
-             avpkt->data = avctx->internal->byte_buffer;
-             avpkt->size = avctx->internal->byte_buffer_size;
-         }
-     }
-     if (avpkt->data) {
-         AVBufferRef *buf = avpkt->buf;
-         if (avpkt->size < size) {
-             av_log(avctx, AV_LOG_ERROR, "User packet is too small (%d < %"PRId64")\n", avpkt->size, size);
-             return AVERROR(EINVAL);
-         }
-         av_init_packet(avpkt);
-         avpkt->buf      = buf;
-         avpkt->size     = size;
-         return 0;
-     } else {
-         int ret = av_new_packet(avpkt, size);
-         if (ret < 0)
-             av_log(avctx, AV_LOG_ERROR, "Failed to allocate packet of size %"PRId64"\n", size);
-         return ret;
-     }
- }
- int ff_alloc_packet(AVPacket *avpkt, int size)
- {
-     return ff_alloc_packet2(NULL, avpkt, size, 0);
- }
- /**
-  * Pad last frame with silence.
-  */
- static int pad_last_frame(AVCodecContext *s, AVFrame **dst, const AVFrame *src)
- {
-     AVFrame *frame = NULL;
-     int ret;
-     if (!(frame = av_frame_alloc()))
-         return AVERROR(ENOMEM);
-     frame->format         = src->format;
-     frame->channel_layout = src->channel_layout;
-     av_frame_set_channels(frame, av_frame_get_channels(src));
-     frame->nb_samples     = s->frame_size;
-     ret = av_frame_get_buffer(frame, 32);
-     if (ret < 0)
-         goto fail;
-     ret = av_frame_copy_props(frame, src);
-     if (ret < 0)
-         goto fail;
-     if ((ret = av_samples_copy(frame->extended_data, src->extended_data, 0, 0,
-                                src->nb_samples, s->channels, s->sample_fmt)) < 0)
-         goto fail;
-     if ((ret = av_samples_set_silence(frame->extended_data, src->nb_samples,
-                                       frame->nb_samples - src->nb_samples,
-                                       s->channels, s->sample_fmt)) < 0)
-         goto fail;
-     *dst = frame;
-     return 0;
- fail:
-     av_frame_free(&frame);
-     return ret;
- }
- int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
-                                               AVPacket *avpkt,
-                                               const AVFrame *frame,
-                                               int *got_packet_ptr)
- {
-     AVFrame *extended_frame = NULL;
-     AVFrame *padded_frame = NULL;
-     int ret;
-     AVPacket user_pkt = *avpkt;
-     int needs_realloc = !user_pkt.data;
-     *got_packet_ptr = 0;
-     if (!avctx->codec->encode2) {
-         av_log(avctx, AV_LOG_ERROR, "This encoder requires using the avcodec_send_frame() API.\n");
-         return AVERROR(ENOSYS);
-     }
-     if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) {
-         av_packet_unref(avpkt);
-         av_init_packet(avpkt);
-         return 0;
-     }
-     /* ensure that extended_data is properly set */
-     if (frame && !frame->extended_data) {
-         if (av_sample_fmt_is_planar(avctx->sample_fmt) &&
-             avctx->channels > AV_NUM_DATA_POINTERS) {
-             av_log(avctx, AV_LOG_ERROR, "Encoding to a planar sample format, "
-                                         "with more than %d channels, but extended_data is not set.\n",
-                    AV_NUM_DATA_POINTERS);
-             return AVERROR(EINVAL);
-         }
-         av_log(avctx, AV_LOG_WARNING, "extended_data is not set.\n");
-         extended_frame = av_frame_alloc();
-         if (!extended_frame)
-             return AVERROR(ENOMEM);
-         memcpy(extended_frame, frame, sizeof(AVFrame));
-         extended_frame->extended_data = extended_frame->data;
-         frame = extended_frame;
-     }
-     /* extract audio service type metadata */
-     if (frame) {
-         AVFrameSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_AUDIO_SERVICE_TYPE);
-         if (sd && sd->size >= sizeof(enum AVAudioServiceType))
-             avctx->audio_service_type = *(enum AVAudioServiceType*)sd->data;
-     }
-     /* check for valid frame size */
-     if (frame) {
-         if (avctx->codec->capabilities & AV_CODEC_CAP_SMALL_LAST_FRAME) {
-             if (frame->nb_samples > avctx->frame_size) {
-                 av_log(avctx, AV_LOG_ERROR, "more samples than frame size (avcodec_encode_audio2)\n");
-                 ret = AVERROR(EINVAL);
-                 goto end;
-             }
-         } else if (!(avctx->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)) {
-             if (frame->nb_samples < avctx->frame_size &&
-                 !avctx->internal->last_audio_frame) {
-                 ret = pad_last_frame(avctx, &padded_frame, frame);
-                 if (ret < 0)
-                     goto end;
-                 frame = padded_frame;
-                 avctx->internal->last_audio_frame = 1;
-             }
-             if (frame->nb_samples != avctx->frame_size) {
-                 av_log(avctx, AV_LOG_ERROR, "nb_samples (%d) != frame_size (%d) (avcodec_encode_audio2)\n", frame->nb_samples, avctx->frame_size);
-                 ret = AVERROR(EINVAL);
-                 goto end;
-             }
-         }
-     }
-     av_assert0(avctx->codec->encode2);
-     ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr);
-     if (!ret) {
-         if (*got_packet_ptr) {
-             if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) {
-                 if (avpkt->pts == AV_NOPTS_VALUE)
-                     avpkt->pts = frame->pts;
-                 if (!avpkt->duration)
-                     avpkt->duration = ff_samples_to_time_base(avctx,
-                                                               frame->nb_samples);
-             }
-             avpkt->dts = avpkt->pts;
-         } else {
-             avpkt->size = 0;
-         }
-     }
-     if (avpkt->data && avpkt->data == avctx->internal->byte_buffer) {
-         needs_realloc = 0;
-         if (user_pkt.data) {
-             if (user_pkt.size >= avpkt->size) {
-                 memcpy(user_pkt.data, avpkt->data, avpkt->size);
-             } else {
-                 av_log(avctx, AV_LOG_ERROR, "Provided packet is too small, needs to be %d\n", avpkt->size);
-                 avpkt->size = user_pkt.size;
-                 ret = -1;
-             }
-             avpkt->buf      = user_pkt.buf;
-             avpkt->data     = user_pkt.data;
-         } else {
-             if (av_dup_packet(avpkt) < 0) {
-                 ret = AVERROR(ENOMEM);
-             }
-         }
-     }
-     if (!ret) {
-         if (needs_realloc && avpkt->data) {
-             ret = av_buffer_realloc(&avpkt->buf, avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE);
-             if (ret >= 0)
-                 avpkt->data = avpkt->buf->data;
-         }
-         avctx->frame_number++;
-     }
-     if (ret < 0 || !*got_packet_ptr) {
-         av_packet_unref(avpkt);
-         av_init_packet(avpkt);
-         goto end;
-     }
-     /* NOTE: if we add any audio encoders which output non-keyframe packets,
-      *       this needs to be moved to the encoders, but for now we can do it
-      *       here to simplify things */
-     avpkt->flags |= AV_PKT_FLAG_KEY;
- end:
-     av_frame_free(&padded_frame);
-     av_free(extended_frame);
- #if FF_API_AUDIOENC_DELAY
-     avctx->delay = avctx->initial_padding;
- #endif
-     return ret;
- }
- int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx,
-                                               AVPacket *avpkt,
-                                               const AVFrame *frame,
-                                               int *got_packet_ptr)
- {
-     int ret;
-     AVPacket user_pkt = *avpkt;
-     int needs_realloc = !user_pkt.data;
-     *got_packet_ptr = 0;
-     if (!avctx->codec->encode2) {
-         av_log(avctx, AV_LOG_ERROR, "This encoder requires using the avcodec_send_frame() API.\n");
-         return AVERROR(ENOSYS);
-     }
-     if(CONFIG_FRAME_THREAD_ENCODER &&
-        avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))
-         return ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr);
-     if ((avctx->flags&AV_CODEC_FLAG_PASS1) && avctx->stats_out)
-         avctx->stats_out[0] = '\0';
-     if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) {
-         av_packet_unref(avpkt);
-         av_init_packet(avpkt);
-         avpkt->size = 0;
-         return 0;
-     }
-     if (av_image_check_size2(avctx->width, avctx->height, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx))
-         return AVERROR(EINVAL);
-     if (frame && frame->format == AV_PIX_FMT_NONE)
-         av_log(avctx, AV_LOG_WARNING, "AVFrame.format is not set\n");
-     if (frame && (frame->width == 0 || frame->height == 0))
-         av_log(avctx, AV_LOG_WARNING, "AVFrame.width or height is not set\n");
-     av_assert0(avctx->codec->encode2);
-     ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr);
-     av_assert0(ret <= 0);
-     emms_c();
-     if (avpkt->data && avpkt->data == avctx->internal->byte_buffer) {
-         needs_realloc = 0;
-         if (user_pkt.data) {
-             if (user_pkt.size >= avpkt->size) {
-                 memcpy(user_pkt.data, avpkt->data, avpkt->size);
-             } else {
-                 av_log(avctx, AV_LOG_ERROR, "Provided packet is too small, needs to be %d\n", avpkt->size);
-                 avpkt->size = user_pkt.size;
-                 ret = -1;
-             }
-             avpkt->buf      = user_pkt.buf;
-             avpkt->data     = user_pkt.data;
-         } else {
-             if (av_dup_packet(avpkt) < 0) {
-                 ret = AVERROR(ENOMEM);
-             }
-         }
-     }
-     if (!ret) {
-         if (!*got_packet_ptr)
-             avpkt->size = 0;
-         else if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
-             avpkt->pts = avpkt->dts = frame->pts;
-         if (needs_realloc && avpkt->data) {
-             ret = av_buffer_realloc(&avpkt->buf, avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE);
-             if (ret >= 0)
-                 avpkt->data = avpkt->buf->data;
-         }
-         avctx->frame_number++;
-     }
-     if (ret < 0 || !*got_packet_ptr)
-         av_packet_unref(avpkt);
-     return ret;
- }
- int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
-                             const AVSubtitle *sub)
- {
-     int ret;
-     if (sub->start_display_time) {
-         av_log(avctx, AV_LOG_ERROR, "start_display_time must be 0.\n");
-         return -1;
-     }
-     ret = avctx->codec->encode_sub(avctx, buf, buf_size, sub);
-     avctx->frame_number++;
-     return ret;
- }
 -static int apply_param_change(AVCodecContext *avctx, AVPacket *avpkt)
 +/**
 + * Attempt to guess proper monotonic timestamps for decoded video frames
 + * which might have incorrect times. Input timestamps may wrap around, in
 + * which case the output will as well.
 + *
 + * @param pts the pts field of the decoded AVPacket, as passed through
 + * AVFrame.pts
 + * @param dts the dts field of the decoded AVPacket
 + * @return one of the input values, may be AV_NOPTS_VALUE
 + */
 +static int64_t guess_correct_pts(AVCodecContext *ctx,
 +                                 int64_t reordered_pts, int64_t dts)
 +{
 +    int64_t pts = AV_NOPTS_VALUE;
 +
 +    if (dts != AV_NOPTS_VALUE) {
 +        ctx->pts_correction_num_faulty_dts += dts <= ctx->pts_correction_last_dts;
 +        ctx->pts_correction_last_dts = dts;
 +    } else if (reordered_pts != AV_NOPTS_VALUE)
 +        ctx->pts_correction_last_dts = reordered_pts;
 +
 +    if (reordered_pts != AV_NOPTS_VALUE) {
 +        ctx->pts_correction_num_faulty_pts += reordered_pts <= ctx->pts_correction_last_pts;
 +        ctx->pts_correction_last_pts = reordered_pts;
 +    } else if(dts != AV_NOPTS_VALUE)
 +        ctx->pts_correction_last_pts = dts;
 +
 +    if ((ctx->pts_correction_num_faulty_pts<=ctx->pts_correction_num_faulty_dts || dts == AV_NOPTS_VALUE)
 +       && reordered_pts != AV_NOPTS_VALUE)
 +        pts = reordered_pts;
 +    else
 +        pts = dts;
 +
 +    return pts;
 +}
 +
 +static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt)
  {
      int size = 0, ret;
      const uint8_t *data;
      uint32_t flags;
 +    int64_t val;
  
      data = av_packet_get_side_data(avpkt, AV_PKT_DATA_PARAM_CHANGE, &size);
      if (!data)
      if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) {
          if (size < 4)
              goto fail;
 -        avctx->channels = bytestream_get_le32(&data);
 +        val = bytestream_get_le32(&data);
 +        if (val <= 0 || val > INT_MAX) {
 +            av_log(avctx, AV_LOG_ERROR, "Invalid channel count");
 +            ret = AVERROR_INVALIDDATA;
 +            goto fail2;
 +        }
 +        avctx->channels = val;
          size -= 4;
      }
      if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) {
      if (flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) {
          if (size < 4)
              goto fail;
 -        avctx->sample_rate = bytestream_get_le32(&data);
 +        val = bytestream_get_le32(&data);
 +        if (val <= 0 || val > INT_MAX) {
 +            av_log(avctx, AV_LOG_ERROR, "Invalid sample rate");
 +            ret = AVERROR_INVALIDDATA;
 +            goto fail2;
 +        }
 +        avctx->sample_rate = val;
          size -= 4;
      }
      if (flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) {
@@@ -2197,7 -1293,7 +1866,7 @@@ static int unrefcount_frame(AVCodecInte
      memcpy(frame->data,     avci->to_free->data,     sizeof(frame->data));
      memcpy(frame->linesize, avci->to_free->linesize, sizeof(frame->linesize));
      if (avci->to_free->extended_data != avci->to_free->data) {
 -        int planes = av_get_channel_layout_nb_channels(avci->to_free->channel_layout);
 +        int planes = av_frame_get_channels(avci->to_free);
          int size   = planes * sizeof(*frame->extended_data);
  
          if (!size) {
      frame->height         = avci->to_free->height;
      frame->channel_layout = avci->to_free->channel_layout;
      frame->nb_samples     = avci->to_free->nb_samples;
 +    av_frame_set_channels(frame, av_frame_get_channels(avci->to_free));
  
      return 0;
  }
  
  int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
                                                int *got_picture_ptr,
 -                                              AVPacket *avpkt)
 +                                              const AVPacket *avpkt)
  {
      AVCodecInternal *avci = avctx->internal;
      int ret;
 +    // copy to ensure we do not change avpkt
 +    AVPacket tmp = *avpkt;
  
 -    *got_picture_ptr = 0;
 -    if ((avctx->coded_width || avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx))
 -        return -1;
 +    if (!avctx->codec)
 +        return AVERROR(EINVAL);
 +    if (avctx->codec->type != AVMEDIA_TYPE_VIDEO) {
 +        av_log(avctx, AV_LOG_ERROR, "Invalid media type for video\n");
 +        return AVERROR(EINVAL);
 +    }
  
      if (!avctx->codec->decode) {
          av_log(avctx, AV_LOG_ERROR, "This decoder requires using the avcodec_send_packet() API.\n");
          return AVERROR(ENOSYS);
      }
  
 +    *got_picture_ptr = 0;
 +    if ((avctx->coded_width || avctx->coded_height) && av_image_check_size2(avctx->coded_width, avctx->coded_height, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx))
 +        return AVERROR(EINVAL);
 +
      avctx->internal->pkt = avpkt;
      ret = apply_param_change(avctx, avpkt);
      if (ret < 0)
  
      if ((avctx->codec->capabilities & AV_CODEC_CAP_DELAY) || avpkt->size ||
          (avctx->active_thread_type & FF_THREAD_FRAME)) {
 +#if FF_API_MERGE_SD
 +FF_DISABLE_DEPRECATION_WARNINGS
 +        int did_split = av_packet_split_side_data(&tmp);
 +FF_ENABLE_DEPRECATION_WARNINGS
 +#endif
 +        ret = apply_param_change(avctx, &tmp);
 +        if (ret < 0)
 +            goto fail;
 +
 +        avctx->internal->pkt = &tmp;
          if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
              ret = ff_thread_decode_frame(avctx, picture, got_picture_ptr,
 -                                         avpkt);
 +                                         &tmp);
          else {
              ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
 -                                       avpkt);
 +                                       &tmp);
              if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_PKT_DTS))
                  picture->pkt_dts = avpkt->dts;
 +
 +            if(!avctx->has_b_frames){
 +                av_frame_set_pkt_pos(picture, avpkt->pos);
 +            }
 +            //FIXME these should be under if(!avctx->has_b_frames)
              /* get_buffer is supposed to set frame parameters */
              if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1)) {
 -                picture->sample_aspect_ratio = avctx->sample_aspect_ratio;
 -                picture->width               = avctx->width;
 -                picture->height              = avctx->height;
 -                picture->format              = avctx->pix_fmt;
 +                if (!picture->sample_aspect_ratio.num)    picture->sample_aspect_ratio = avctx->sample_aspect_ratio;
 +                if (!picture->width)                      picture->width               = avctx->width;
 +                if (!picture->height)                     picture->height              = avctx->height;
 +                if (picture->format == AV_PIX_FMT_NONE)   picture->format              = avctx->pix_fmt;
              }
          }
  
 +fail:
          emms_c(); //needed to avoid an emms_c() call before every return;
  
 +        avctx->internal->pkt = NULL;
 +#if FF_API_MERGE_SD
 +        if (did_split) {
 +            av_packet_free_side_data(&tmp);
 +            if(ret == tmp.size)
 +                ret = avpkt->size;
 +        }
 +#endif
 +        if (picture->flags & AV_FRAME_FLAG_DISCARD) {
 +            *got_picture_ptr = 0;
 +        }
          if (*got_picture_ptr) {
              if (!avctx->refcounted_frames) {
                  int err = unrefcount_frame(avci, picture);
                      return err;
              }
  
 -            avctx->frame_number++;
 -        } else
 -            av_frame_unref(picture);
 -    } else
 -        ret = 0;
 +            avctx->frame_number++;
 +            av_frame_set_best_effort_timestamp(picture,
 +                                               guess_correct_pts(avctx,
 +                                                                 picture->pts,
 +                                                                 picture->pkt_dts));
 +        } else
 +            av_frame_unref(picture);
 +    } else
 +        ret = 0;
 +
 +    /* many decoders assign whole AVFrames, thus overwriting extended_data;
 +     * make sure it's set correctly */
 +    av_assert0(!picture->extended_data || picture->extended_data == picture->data);
 +
 +#if FF_API_AVCTX_TIMEBASE
 +    if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
 +        avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
 +#endif
 +
 +    return ret;
 +}
 +
 +int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
 +                                              AVFrame *frame,
 +                                              int *got_frame_ptr,
 +                                              const AVPacket *avpkt)
 +{
 +    AVCodecInternal *avci = avctx->internal;
 +    int ret = 0;
 +
 +    *got_frame_ptr = 0;
 +
 +    if (!avctx->codec)
 +        return AVERROR(EINVAL);
 +
 +    if (!avctx->codec->decode) {
 +        av_log(avctx, AV_LOG_ERROR, "This decoder requires using the avcodec_send_packet() API.\n");
 +        return AVERROR(ENOSYS);
 +    }
 +
 +    if (!avpkt->data && avpkt->size) {
 +        av_log(avctx, AV_LOG_ERROR, "invalid packet: NULL data, size != 0\n");
 +        return AVERROR(EINVAL);
 +    }
 +    if (avctx->codec->type != AVMEDIA_TYPE_AUDIO) {
 +        av_log(avctx, AV_LOG_ERROR, "Invalid media type for audio\n");
 +        return AVERROR(EINVAL);
 +    }
 +
 +    av_frame_unref(frame);
 +
 +    if ((avctx->codec->capabilities & AV_CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type & FF_THREAD_FRAME)) {
 +        uint8_t *side;
 +        int side_size;
 +        uint32_t discard_padding = 0;
 +        uint8_t skip_reason = 0;
 +        uint8_t discard_reason = 0;
 +        // copy to ensure we do not change avpkt
 +        AVPacket tmp = *avpkt;
 +#if FF_API_MERGE_SD
 +FF_DISABLE_DEPRECATION_WARNINGS
 +        int did_split = av_packet_split_side_data(&tmp);
 +FF_ENABLE_DEPRECATION_WARNINGS
 +#endif
 +        ret = apply_param_change(avctx, &tmp);
 +        if (ret < 0)
 +            goto fail;
 +
 +        avctx->internal->pkt = &tmp;
 +        if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
 +            ret = ff_thread_decode_frame(avctx, frame, got_frame_ptr, &tmp);
 +        else {
 +            ret = avctx->codec->decode(avctx, frame, got_frame_ptr, &tmp);
 +            av_assert0(ret <= tmp.size);
 +            frame->pkt_dts = avpkt->dts;
 +        }
 +        if (ret >= 0 && *got_frame_ptr) {
 +            avctx->frame_number++;
 +            av_frame_set_best_effort_timestamp(frame,
 +                                               guess_correct_pts(avctx,
 +                                                                 frame->pts,
 +                                                                 frame->pkt_dts));
 +            if (frame->format == AV_SAMPLE_FMT_NONE)
 +                frame->format = avctx->sample_fmt;
 +            if (!frame->channel_layout)
 +                frame->channel_layout = avctx->channel_layout;
 +            if (!av_frame_get_channels(frame))
 +                av_frame_set_channels(frame, avctx->channels);
 +            if (!frame->sample_rate)
 +                frame->sample_rate = avctx->sample_rate;
 +        }
 +
 +        side= av_packet_get_side_data(avctx->internal->pkt, AV_PKT_DATA_SKIP_SAMPLES, &side_size);
 +        if(side && side_size>=10) {
 +            avctx->internal->skip_samples = AV_RL32(side) * avctx->internal->skip_samples_multiplier;
 +            discard_padding = AV_RL32(side + 4);
 +            av_log(avctx, AV_LOG_DEBUG, "skip %d / discard %d samples due to side data\n",
 +                   avctx->internal->skip_samples, (int)discard_padding);
 +            skip_reason = AV_RL8(side + 8);
 +            discard_reason = AV_RL8(side + 9);
 +        }
 +
 +        if ((frame->flags & AV_FRAME_FLAG_DISCARD) && *got_frame_ptr &&
 +            !(avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
 +            avctx->internal->skip_samples = FFMAX(0, avctx->internal->skip_samples - frame->nb_samples);
 +            *got_frame_ptr = 0;
 +        }
 +
 +        if (avctx->internal->skip_samples > 0 && *got_frame_ptr &&
 +            !(avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
 +            if(frame->nb_samples <= avctx->internal->skip_samples){
 +                *got_frame_ptr = 0;
 +                avctx->internal->skip_samples -= frame->nb_samples;
 +                av_log(avctx, AV_LOG_DEBUG, "skip whole frame, skip left: %d\n",
 +                       avctx->internal->skip_samples);
 +            } else {
 +                av_samples_copy(frame->extended_data, frame->extended_data, 0, avctx->internal->skip_samples,
 +                                frame->nb_samples - avctx->internal->skip_samples, avctx->channels, frame->format);
 +                if(avctx->pkt_timebase.num && avctx->sample_rate) {
 +                    int64_t diff_ts = av_rescale_q(avctx->internal->skip_samples,
 +                                                   (AVRational){1, avctx->sample_rate},
 +                                                   avctx->pkt_timebase);
 +                    if(frame->pts!=AV_NOPTS_VALUE)
 +                        frame->pts += diff_ts;
 +#if FF_API_PKT_PTS
 +FF_DISABLE_DEPRECATION_WARNINGS
 +                    if(frame->pkt_pts!=AV_NOPTS_VALUE)
 +                        frame->pkt_pts += diff_ts;
 +FF_ENABLE_DEPRECATION_WARNINGS
 +#endif
 +                    if(frame->pkt_dts!=AV_NOPTS_VALUE)
 +                        frame->pkt_dts += diff_ts;
 +                    if (av_frame_get_pkt_duration(frame) >= diff_ts)
 +                        av_frame_set_pkt_duration(frame, av_frame_get_pkt_duration(frame) - diff_ts);
 +                } else {
 +                    av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for skipped samples.\n");
 +                }
 +                av_log(avctx, AV_LOG_DEBUG, "skip %d/%d samples\n",
 +                       avctx->internal->skip_samples, frame->nb_samples);
 +                frame->nb_samples -= avctx->internal->skip_samples;
 +                avctx->internal->skip_samples = 0;
 +            }
 +        }
 +
 +        if (discard_padding > 0 && discard_padding <= frame->nb_samples && *got_frame_ptr &&
 +            !(avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
 +            if (discard_padding == frame->nb_samples) {
 +                *got_frame_ptr = 0;
 +            } else {
 +                if(avctx->pkt_timebase.num && avctx->sample_rate) {
 +                    int64_t diff_ts = av_rescale_q(frame->nb_samples - discard_padding,
 +                                                   (AVRational){1, avctx->sample_rate},
 +                                                   avctx->pkt_timebase);
 +                    av_frame_set_pkt_duration(frame, diff_ts);
 +                } else {
 +                    av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for discarded samples.\n");
 +                }
 +                av_log(avctx, AV_LOG_DEBUG, "discard %d/%d samples\n",
 +                       (int)discard_padding, frame->nb_samples);
 +                frame->nb_samples -= discard_padding;
 +            }
 +        }
 +
 +        if ((avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL) && *got_frame_ptr) {
 +            AVFrameSideData *fside = av_frame_new_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES, 10);
 +            if (fside) {
 +                AV_WL32(fside->data, avctx->internal->skip_samples);
 +                AV_WL32(fside->data + 4, discard_padding);
 +                AV_WL8(fside->data + 8, skip_reason);
 +                AV_WL8(fside->data + 9, discard_reason);
 +                avctx->internal->skip_samples = 0;
 +            }
 +        }
 +fail:
 +        avctx->internal->pkt = NULL;
 +#if FF_API_MERGE_SD
 +        if (did_split) {
 +            av_packet_free_side_data(&tmp);
 +            if(ret == tmp.size)
 +                ret = avpkt->size;
 +        }
 +#endif
 +
 +        if (ret >= 0 && *got_frame_ptr) {
 +            if (!avctx->refcounted_frames) {
 +                int err = unrefcount_frame(avci, frame);
 +                if (err < 0)
 +                    return err;
 +            }
 +        } else
 +            av_frame_unref(frame);
 +    }
 +
 +    av_assert0(ret <= avpkt->size);
 +
 +    if (!avci->showed_multi_packet_warning &&
 +        ret >= 0 && ret != avpkt->size && !(avctx->codec->capabilities & AV_CODEC_CAP_SUBFRAMES)) {
 +            av_log(avctx, AV_LOG_WARNING, "Multiple frames in a packet.\n");
 +        avci->showed_multi_packet_warning = 1;
 +    }
 +
 +    return ret;
 +}
 +
 +#define UTF8_MAX_BYTES 4 /* 5 and 6 bytes sequences should not be used */
 +static int recode_subtitle(AVCodecContext *avctx,
 +                           AVPacket *outpkt, const AVPacket *inpkt)
 +{
 +#if CONFIG_ICONV
 +    iconv_t cd = (iconv_t)-1;
 +    int ret = 0;
 +    char *inb, *outb;
 +    size_t inl, outl;
 +    AVPacket tmp;
 +#endif
 +
 +    if (avctx->sub_charenc_mode != FF_SUB_CHARENC_MODE_PRE_DECODER || inpkt->size == 0)
 +        return 0;
 +
 +#if CONFIG_ICONV
 +    cd = iconv_open("UTF-8", avctx->sub_charenc);
 +    av_assert0(cd != (iconv_t)-1);
 +
 +    inb = inpkt->data;
 +    inl = inpkt->size;
 +
 +    if (inl >= INT_MAX / UTF8_MAX_BYTES - AV_INPUT_BUFFER_PADDING_SIZE) {
 +        av_log(avctx, AV_LOG_ERROR, "Subtitles packet is too big for recoding\n");
 +        ret = AVERROR(ENOMEM);
 +        goto end;
 +    }
 +
 +    ret = av_new_packet(&tmp, inl * UTF8_MAX_BYTES);
 +    if (ret < 0)
 +        goto end;
 +    outpkt->buf  = tmp.buf;
 +    outpkt->data = tmp.data;
 +    outpkt->size = tmp.size;
 +    outb = outpkt->data;
 +    outl = outpkt->size;
 +
 +    if (iconv(cd, &inb, &inl, &outb, &outl) == (size_t)-1 ||
 +        iconv(cd, NULL, NULL, &outb, &outl) == (size_t)-1 ||
 +        outl >= outpkt->size || inl != 0) {
 +        ret = FFMIN(AVERROR(errno), -1);
 +        av_log(avctx, AV_LOG_ERROR, "Unable to recode subtitle event \"%s\" "
 +               "from %s to UTF-8\n", inpkt->data, avctx->sub_charenc);
 +        av_packet_unref(&tmp);
 +        goto end;
 +    }
 +    outpkt->size -= outl;
 +    memset(outpkt->data + outpkt->size, 0, outl);
 +
 +end:
 +    if (cd != (iconv_t)-1)
 +        iconv_close(cd);
 +    return ret;
 +#else
 +    av_log(avctx, AV_LOG_ERROR, "requesting subtitles recoding without iconv");
 +    return AVERROR(EINVAL);
 +#endif
 +}
 +
 +static int utf8_check(const uint8_t *str)
 +{
 +    const uint8_t *byte;
 +    uint32_t codepoint, min;
 +
 +    while (*str) {
 +        byte = str;
 +        GET_UTF8(codepoint, *(byte++), return 0;);
 +        min = byte - str == 1 ? 0 : byte - str == 2 ? 0x80 :
 +              1 << (5 * (byte - str) - 4);
 +        if (codepoint < min || codepoint >= 0x110000 ||
 +            codepoint == 0xFFFE /* BOM */ ||
 +            codepoint >= 0xD800 && codepoint <= 0xDFFF /* surrogates */)
 +            return 0;
 +        str = byte;
 +    }
 +    return 1;
 +}
  
 -#if FF_API_AVCTX_TIMEBASE
 -    if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
 -        avctx->time_base = av_inv_q(avctx->framerate);
 -#endif
 +#if FF_API_ASS_TIMING
 +static void insert_ts(AVBPrint *buf, int ts)
 +{
 +    if (ts == -1) {
 +        av_bprintf(buf, "9:59:59.99,");
 +    } else {
 +        int h, m, s;
  
 -    return ret;
 +        h = ts/360000;  ts -= 360000*h;
 +        m = ts/  6000;  ts -=   6000*m;
 +        s = ts/   100;  ts -=    100*s;
 +        av_bprintf(buf, "%d:%02d:%02d.%02d,", h, m, s, ts);
 +    }
  }
  
 -int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
 -                                              AVFrame *frame,
 -                                              int *got_frame_ptr,
 -                                              AVPacket *avpkt)
 +static int convert_sub_to_old_ass_form(AVSubtitle *sub, const AVPacket *pkt, AVRational tb)
  {
 -    AVCodecInternal *avci = avctx->internal;
 -    int ret = 0;
 +    int i;
 +    AVBPrint buf;
  
 -    *got_frame_ptr = 0;
 +    av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
  
 -    if (!avctx->codec->decode) {
 -        av_log(avctx, AV_LOG_ERROR, "This decoder requires using the avcodec_send_packet() API.\n");
 -        return AVERROR(ENOSYS);
 +    for (i = 0; i < sub->num_rects; i++) {
 +        char *final_dialog;
 +        const char *dialog;
 +        AVSubtitleRect *rect = sub->rects[i];
 +        int ts_start, ts_duration = -1;
 +        long int layer;
 +
 +        if (rect->type != SUBTITLE_ASS || !strncmp(rect->ass, "Dialogue: ", 10))
 +            continue;
 +
 +        av_bprint_clear(&buf);
 +
 +        /* skip ReadOrder */
 +        dialog = strchr(rect->ass, ',');
 +        if (!dialog)
 +            continue;
 +        dialog++;
 +
 +        /* extract Layer or Marked */
 +        layer = strtol(dialog, (char**)&dialog, 10);
 +        if (*dialog != ',')
 +            continue;
 +        dialog++;
 +
 +        /* rescale timing to ASS time base (ms) */
 +        ts_start = av_rescale_q(pkt->pts, tb, av_make_q(1, 100));
 +        if (pkt->duration != -1)
 +            ts_duration = av_rescale_q(pkt->duration, tb, av_make_q(1, 100));
 +        sub->end_display_time = FFMAX(sub->end_display_time, 10 * ts_duration);
 +
 +        /* construct ASS (standalone file form with timestamps) string */
 +        av_bprintf(&buf, "Dialogue: %ld,", layer);
 +        insert_ts(&buf, ts_start);
 +        insert_ts(&buf, ts_duration == -1 ? -1 : ts_start + ts_duration);
 +        av_bprintf(&buf, "%s\r\n", dialog);
 +
 +        final_dialog = av_strdup(buf.str);
 +        if (!av_bprint_is_complete(&buf) || !final_dialog) {
 +            av_freep(&final_dialog);
 +            av_bprint_finalize(&buf, NULL);
 +            return AVERROR(ENOMEM);
 +        }
 +        av_freep(&rect->ass);
 +        rect->ass = final_dialog;
      }
  
 -    avctx->internal->pkt = avpkt;
 +    av_bprint_finalize(&buf, NULL);
 +    return 0;
 +}
 +#endif
 +
 +int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
 +                             int *got_sub_ptr,
 +                             AVPacket *avpkt)
 +{
 +    int i, ret = 0;
  
      if (!avpkt->data && avpkt->size) {
          av_log(avctx, AV_LOG_ERROR, "invalid packet: NULL data, size != 0\n");
          return AVERROR(EINVAL);
      }
 +    if (!avctx->codec)
 +        return AVERROR(EINVAL);
 +    if (avctx->codec->type != AVMEDIA_TYPE_SUBTITLE) {
 +        av_log(avctx, AV_LOG_ERROR, "Invalid media type for subtitles\n");
 +        return AVERROR(EINVAL);
 +    }
  
 -    ret = apply_param_change(avctx, avpkt);
 -    if (ret < 0)
 -        return ret;
 -
 -    av_frame_unref(frame);
 +    *got_sub_ptr = 0;
 +    get_subtitle_defaults(sub);
  
      if ((avctx->codec->capabilities & AV_CODEC_CAP_DELAY) || avpkt->size) {
 -        ret = avctx->codec->decode(avctx, frame, got_frame_ptr, avpkt);
 -        if (ret >= 0 && *got_frame_ptr) {
 -            avctx->frame_number++;
 -            frame->pkt_dts = avpkt->dts;
 -            if (frame->format == AV_SAMPLE_FMT_NONE)
 -                frame->format = avctx->sample_fmt;
 +        AVPacket pkt_recoded;
 +        AVPacket tmp = *avpkt;
 +#if FF_API_MERGE_SD
 +FF_DISABLE_DEPRECATION_WARNINGS
 +        int did_split = av_packet_split_side_data(&tmp);
 +        //apply_param_change(avctx, &tmp);
 +
 +        if (did_split) {
 +            /* FFMIN() prevents overflow in case the packet wasn't allocated with
 +             * proper padding.
 +             * If the side data is smaller than the buffer padding size, the
 +             * remaining bytes should have already been filled with zeros by the
 +             * original packet allocation anyway. */
 +            memset(tmp.data + tmp.size, 0,
 +                   FFMIN(avpkt->size - tmp.size, AV_INPUT_BUFFER_PADDING_SIZE));
 +        }
 +FF_ENABLE_DEPRECATION_WARNINGS
 +#endif
  
 -            if (!avctx->refcounted_frames) {
 -                int err = unrefcount_frame(avci, frame);
 +        pkt_recoded = tmp;
 +        ret = recode_subtitle(avctx, &pkt_recoded, &tmp);
 +        if (ret < 0) {
 +            *got_sub_ptr = 0;
 +        } else {
 +            avctx->internal->pkt = &pkt_recoded;
 +
 +            if (avctx->pkt_timebase.num && avpkt->pts != AV_NOPTS_VALUE)
 +                sub->pts = av_rescale_q(avpkt->pts,
 +                                        avctx->pkt_timebase, AV_TIME_BASE_Q);
 +            ret = avctx->codec->decode(avctx, sub, got_sub_ptr, &pkt_recoded);
 +            av_assert1((ret >= 0) >= !!*got_sub_ptr &&
 +                       !!*got_sub_ptr >= !!sub->num_rects);
 +
 +#if FF_API_ASS_TIMING
 +            if (avctx->sub_text_format == FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS
 +                && *got_sub_ptr && sub->num_rects) {
 +                const AVRational tb = avctx->pkt_timebase.num ? avctx->pkt_timebase
 +                                                              : avctx->time_base;
 +                int err = convert_sub_to_old_ass_form(sub, avpkt, tb);
                  if (err < 0)
 -                    return err;
 +                    ret = err;
              }
 -        } else
 -            av_frame_unref(frame);
 -    }
 +#endif
  
 +            if (sub->num_rects && !sub->end_display_time && avpkt->duration &&
 +                avctx->pkt_timebase.num) {
 +                AVRational ms = { 1, 1000 };
 +                sub->end_display_time = av_rescale_q(avpkt->duration,
 +                                                     avctx->pkt_timebase, ms);
 +            }
  
 -    return ret;
 -}
 +            if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB)
 +                sub->format = 0;
 +            else if (avctx->codec_descriptor->props & AV_CODEC_PROP_TEXT_SUB)
 +                sub->format = 1;
 +
 +            for (i = 0; i < sub->num_rects; i++) {
 +                if (sub->rects[i]->ass && !utf8_check(sub->rects[i]->ass)) {
 +                    av_log(avctx, AV_LOG_ERROR,
 +                           "Invalid UTF-8 in decoded subtitles text; "
 +                           "maybe missing -sub_charenc option\n");
 +                    avsubtitle_free(sub);
 +                    ret = AVERROR_INVALIDDATA;
 +                    break;
 +                }
 +            }
  
 -int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
 -                             int *got_sub_ptr,
 -                             AVPacket *avpkt)
 -{
 -    int ret;
 +            if (tmp.data != pkt_recoded.data) { // did we recode?
 +                /* prevent from destroying side data from original packet */
 +                pkt_recoded.side_data = NULL;
 +                pkt_recoded.side_data_elems = 0;
 +
 +                av_packet_unref(&pkt_recoded);
 +            }
 +            avctx->internal->pkt = NULL;
 +        }
 +
 +#if FF_API_MERGE_SD
 +        if (did_split) {
 +            av_packet_free_side_data(&tmp);
 +            if(ret == tmp.size)
 +                ret = avpkt->size;
 +        }
 +#endif
 +
 +        if (*got_sub_ptr)
 +            avctx->frame_number++;
 +    }
  
 -    avctx->internal->pkt = avpkt;
 -    *got_sub_ptr = 0;
 -    ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt);
 -    if (*got_sub_ptr)
 -        avctx->frame_number++;
      return ret;
  }
  
@@@ -2801,7 -1469,7 +2470,7 @@@ void avsubtitle_free(AVSubtitle *sub
  
  static int do_decode(AVCodecContext *avctx, AVPacket *pkt)
  {
 -    int got_frame;
 +    int got_frame = 0;
      int ret;
  
      av_assert0(!avctx->internal->buffer_frame->buf[0]);
      if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
          ret = avcodec_decode_video2(avctx, avctx->internal->buffer_frame,
                                      &got_frame, pkt);
 -        if (ret >= 0)
 +        if (ret >= 0 && !(avctx->flags & AV_CODEC_FLAG_TRUNCATED))
              ret = pkt->size;
      } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
          ret = avcodec_decode_audio4(avctx, avctx->internal->buffer_frame,
          ret = AVERROR(EINVAL);
      }
  
 -    if (ret < 0)
 -        return ret;
 +    if (ret == AVERROR(EAGAIN))
 +        ret = pkt->size;
  
      if (avctx->internal->draining && !got_frame)
          avctx->internal->draining_done = 1;
  
 +    if (ret < 0)
 +        return ret;
 +
      if (ret >= pkt->size) {
          av_packet_unref(avctx->internal->buffer_pkt);
      } else {
@@@ -2873,9 -1538,6 +2542,9 @@@ int attribute_align_arg avcodec_send_pa
      if (avctx->internal->draining)
          return AVERROR_EOF;
  
 +    if (avpkt && !avpkt->size && avpkt->data)
 +        return AVERROR(EINVAL);
 +
      if (!avpkt || !avpkt->size) {
          avctx->internal->draining = 1;
          avpkt = NULL;
  
      if (avctx->codec->send_packet) {
          if (avpkt) {
 -            ret = apply_param_change(avctx, (AVPacket *)avpkt);
 -            if (ret < 0)
 -                return ret;
 +            AVPacket tmp = *avpkt;
 +#if FF_API_MERGE_SD
 +FF_DISABLE_DEPRECATION_WARNINGS
 +            int did_split = av_packet_split_side_data(&tmp);
 +FF_ENABLE_DEPRECATION_WARNINGS
 +#endif
 +            ret = apply_param_change(avctx, &tmp);
 +            if (ret >= 0)
 +                ret = avctx->codec->send_packet(avctx, &tmp);
 +#if FF_API_MERGE_SD
 +            if (did_split)
 +                av_packet_free_side_data(&tmp);
 +#endif
 +            return ret;
 +        } else {
 +            return avctx->codec->send_packet(avctx, NULL);
          }
 -        return avctx->codec->send_packet(avctx, avpkt);
      }
  
      // Emulation via old API. Assume avpkt is likely not refcounted, while
@@@ -2930,14 -1580,7 +2599,14 @@@ int attribute_align_arg avcodec_receive
      if (avctx->codec->receive_frame) {
          if (avctx->internal->draining && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
              return AVERROR_EOF;
 -        return avctx->codec->receive_frame(avctx, frame);
 +        ret = avctx->codec->receive_frame(avctx, frame);
 +        if (ret >= 0) {
 +            if (av_frame_get_best_effort_timestamp(frame) == AV_NOPTS_VALUE) {
 +                av_frame_set_best_effort_timestamp(frame,
 +                    guess_correct_pts(avctx, frame->pts, frame->pkt_dts));
 +            }
 +        }
 +        return ret;
      }
  
      // Emulation via old API.
      return 0;
  }
  
- static int do_encode(AVCodecContext *avctx, const AVFrame *frame, int *got_packet)
- {
-     int ret;
-     *got_packet = 0;
-     av_packet_unref(avctx->internal->buffer_pkt);
-     avctx->internal->buffer_pkt_valid = 0;
-     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
-         ret = avcodec_encode_video2(avctx, avctx->internal->buffer_pkt,
-                                     frame, got_packet);
-     } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
-         ret = avcodec_encode_audio2(avctx, avctx->internal->buffer_pkt,
-                                     frame, got_packet);
-     } else {
-         ret = AVERROR(EINVAL);
-     }
-     if (ret >= 0 && *got_packet) {
-         // Encoders must always return ref-counted buffers.
-         // Side-data only packets have no data and can be not ref-counted.
-         av_assert0(!avctx->internal->buffer_pkt->data || avctx->internal->buffer_pkt->buf);
-         avctx->internal->buffer_pkt_valid = 1;
-         ret = 0;
-     } else {
-         av_packet_unref(avctx->internal->buffer_pkt);
-     }
-     return ret;
- }
- int attribute_align_arg avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
- {
-     if (!avcodec_is_open(avctx) || !av_codec_is_encoder(avctx->codec))
-         return AVERROR(EINVAL);
-     if (avctx->internal->draining)
-         return AVERROR_EOF;
-     if (!frame) {
-         avctx->internal->draining = 1;
-         if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
-             return 0;
-     }
-     if (avctx->codec->send_frame)
-         return avctx->codec->send_frame(avctx, frame);
-     // Emulation via old API. Do it here instead of avcodec_receive_packet, because:
-     // 1. if the AVFrame is not refcounted, the copying will be much more
-     //    expensive than copying the packet data
-     // 2. assume few users use non-refcounted AVPackets, so usually no copy is
-     //    needed
-     if (avctx->internal->buffer_pkt_valid)
-         return AVERROR(EAGAIN);
-     return do_encode(avctx, frame, &(int){0});
- }
- int attribute_align_arg avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
- {
-     av_packet_unref(avpkt);
-     if (!avcodec_is_open(avctx) || !av_codec_is_encoder(avctx->codec))
-         return AVERROR(EINVAL);
-     if (avctx->codec->receive_packet) {
-         if (avctx->internal->draining && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
-             return AVERROR_EOF;
-         return avctx->codec->receive_packet(avctx, avpkt);
-     }
-     // Emulation via old API.
-     if (!avctx->internal->buffer_pkt_valid) {
-         int got_packet;
-         int ret;
-         if (!avctx->internal->draining)
-             return AVERROR(EAGAIN);
-         ret = do_encode(avctx, NULL, &got_packet);
-         if (ret < 0)
-             return ret;
-         if (ret >= 0 && !got_packet)
-             return AVERROR_EOF;
-     }
-     av_packet_move_ref(avpkt, avctx->internal->buffer_pkt);
-     avctx->internal->buffer_pkt_valid = 0;
-     return 0;
- }
  av_cold int avcodec_close(AVCodecContext *avctx)
  {
      int i;
  
 +    if (!avctx)
 +        return 0;
 +
      if (avcodec_is_open(avctx)) {
          FramePool *pool = avctx->internal->pool;
 -
 +        if (CONFIG_FRAME_THREAD_ENCODER &&
 +            avctx->internal->frame_thread_encoder && avctx->thread_count > 1) {
 +            ff_frame_thread_encoder_free(avctx);
 +        }
          if (HAVE_THREADS && avctx->internal->thread_ctx)
              ff_thread_free(avctx);
          if (avctx->codec && avctx->codec->close)
              avctx->codec->close(avctx);
 +        avctx->internal->byte_buffer_size = 0;
 +        av_freep(&avctx->internal->byte_buffer);
          av_frame_free(&avctx->internal->to_free);
          av_frame_free(&avctx->internal->buffer_frame);
          av_packet_free(&avctx->internal->buffer_pkt);
      avctx->nb_coded_side_data = 0;
  
      av_buffer_unref(&avctx->hw_frames_ctx);
 +    av_buffer_unref(&avctx->hw_device_ctx);
  
      if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)
          av_opt_free(avctx->priv_data);
@@@ -3120,20 -1661,10 +2696,20 @@@ FF_ENABLE_DEPRECATION_WARNING
      return 0;
  }
  
 +static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id)
 +{
 +    switch(id){
 +        //This is for future deprecatec codec ids, its empty since
 +        //last major bump but will fill up again over time, please don't remove it
 +        default                                         : return id;
 +    }
 +}
 +
  static AVCodec *find_encdec(enum AVCodecID id, int encoder)
  {
      AVCodec *p, *experimental = NULL;
      p = first_avcodec;
 +    id= remap_deprecated_codec_id(id);
      while (p) {
          if ((encoder ? av_codec_is_encoder(p) : av_codec_is_decoder(p)) &&
              p->id == id) {
@@@ -3185,24 -1716,27 +2761,24 @@@ AVCodec *avcodec_find_decoder_by_name(c
      return NULL;
  }
  
 -static int get_bit_rate(AVCodecContext *ctx)
 +const char *avcodec_get_name(enum AVCodecID id)
  {
 -    int bit_rate;
 -    int bits_per_sample;
 +    const AVCodecDescriptor *cd;
 +    AVCodec *codec;
  
 -    switch (ctx->codec_type) {
 -    case AVMEDIA_TYPE_VIDEO:
 -    case AVMEDIA_TYPE_DATA:
 -    case AVMEDIA_TYPE_SUBTITLE:
 -    case AVMEDIA_TYPE_ATTACHMENT:
 -        bit_rate = ctx->bit_rate;
 -        break;
 -    case AVMEDIA_TYPE_AUDIO:
 -        bits_per_sample = av_get_bits_per_sample(ctx->codec_id);
 -        bit_rate = bits_per_sample ? ctx->sample_rate * ctx->channels * bits_per_sample : ctx->bit_rate;
 -        break;
 -    default:
 -        bit_rate = 0;
 -        break;
 -    }
 -    return bit_rate;
 +    if (id == AV_CODEC_ID_NONE)
 +        return "none";
 +    cd = avcodec_descriptor_get(id);
 +    if (cd)
 +        return cd->name;
 +    av_log(NULL, AV_LOG_WARNING, "Codec 0x%x is not in the full list.\n", id);
 +    codec = avcodec_find_decoder(id);
 +    if (codec)
 +        return codec->name;
 +    codec = avcodec_find_encoder(id);
 +    if (codec)
 +        return codec->name;
 +    return "unknown_codec";
  }
  
  size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag)
  #define TAG_PRINT(x)                                              \
      (((x) >= '0' && (x) <= '9') ||                                \
       ((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z') ||  \
 -     ((x) == '.' || (x) == ' '))
 +     ((x) == '.' || (x) == ' ' || (x) == '-' || (x) == '_'))
  
      for (i = 0; i < 4; i++) {
          len = snprintf(buf, buf_size,
  
  void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
  {
 +    const char *codec_type;
      const char *codec_name;
      const char *profile = NULL;
 -    char buf1[32];
 -    int bitrate;
 +    int64_t bitrate;
      int new_line = 0;
      AVRational display_aspect_ratio;
 -    const AVCodecDescriptor *desc = avcodec_descriptor_get(enc->codec_id);
 +    const char *separator = enc->dump_separator ? (const char *)enc->dump_separator : ", ";
  
 -    if (desc) {
 -        codec_name = desc->name;
 -        profile = avcodec_profile_name(enc->codec_id, enc->profile);
 -    } else if (enc->codec_id == AV_CODEC_ID_MPEG2TS) {
 -        /* fake mpeg2 transport stream codec (currently not
 -         * registered) */
 -        codec_name = "mpeg2ts";
 -    } else {
 -        /* output avi tags */
 -        char tag_buf[32];
 -        av_get_codec_tag_string(tag_buf, sizeof(tag_buf), enc->codec_tag);
 -        snprintf(buf1, sizeof(buf1), "%s / 0x%04X", tag_buf, enc->codec_tag);
 -        codec_name = buf1;
 -    }
 +    if (!buf || buf_size <= 0)
 +        return;
 +    codec_type = av_get_media_type_string(enc->codec_type);
 +    codec_name = avcodec_get_name(enc->codec_id);
 +    profile = avcodec_profile_name(enc->codec_id, enc->profile);
 +
 +    snprintf(buf, buf_size, "%s: %s", codec_type ? codec_type : "unknown",
 +             codec_name);
 +    buf[0] ^= 'a' ^ 'A'; /* first letter in uppercase */
 +
 +    if (enc->codec && strcmp(enc->codec->name, codec_name))
 +        snprintf(buf + strlen(buf), buf_size - strlen(buf), " (%s)", enc->codec->name);
 +
 +    if (profile)
 +        snprintf(buf + strlen(buf), buf_size - strlen(buf), " (%s)", profile);
 +    if (   enc->codec_type == AVMEDIA_TYPE_VIDEO
 +        && av_log_get_level() >= AV_LOG_VERBOSE
 +        && enc->refs)
 +        snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                 ", %d reference frame%s",
 +                 enc->refs, enc->refs > 1 ? "s" : "");
 +
 +    if (enc->codec_tag)
 +        snprintf(buf + strlen(buf), buf_size - strlen(buf), " (%s / 0x%04X)",
 +                 av_fourcc2str(enc->codec_tag), enc->codec_tag);
  
      switch (enc->codec_type) {
      case AVMEDIA_TYPE_VIDEO:
 -        snprintf(buf, buf_size,
 -                 "Video: %s%s",
 -                 codec_name, enc->mb_decision ? " (hq)" : "");
 -        if (profile)
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                     " (%s)", profile);
 -        if (enc->codec_tag) {
 -            char tag_buf[32];
 -            av_get_codec_tag_string(tag_buf, sizeof(tag_buf), enc->codec_tag);
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                     " [%s / 0x%04X]", tag_buf, enc->codec_tag);
 -        }
 +        {
 +            char detail[256] = "(";
  
 -        av_strlcat(buf, "\n      ", buf_size);
 -        snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +            av_strlcat(buf, separator, buf_size);
 +
 +            snprintf(buf + strlen(buf), buf_size - strlen(buf),
                   "%s", enc->pix_fmt == AV_PIX_FMT_NONE ? "none" :
                       av_get_pix_fmt_name(enc->pix_fmt));
 +            if (enc->bits_per_raw_sample && enc->pix_fmt != AV_PIX_FMT_NONE &&
 +                enc->bits_per_raw_sample < av_pix_fmt_desc_get(enc->pix_fmt)->comp[0].depth)
 +                av_strlcatf(detail, sizeof(detail), "%d bpc, ", enc->bits_per_raw_sample);
 +            if (enc->color_range != AVCOL_RANGE_UNSPECIFIED)
 +                av_strlcatf(detail, sizeof(detail), "%s, ",
 +                            av_color_range_name(enc->color_range));
 +
 +            if (enc->colorspace != AVCOL_SPC_UNSPECIFIED ||
 +                enc->color_primaries != AVCOL_PRI_UNSPECIFIED ||
 +                enc->color_trc != AVCOL_TRC_UNSPECIFIED) {
 +                if (enc->colorspace != (int)enc->color_primaries ||
 +                    enc->colorspace != (int)enc->color_trc) {
 +                    new_line = 1;
 +                    av_strlcatf(detail, sizeof(detail), "%s/%s/%s, ",
 +                                av_color_space_name(enc->colorspace),
 +                                av_color_primaries_name(enc->color_primaries),
 +                                av_color_transfer_name(enc->color_trc));
 +                } else
 +                    av_strlcatf(detail, sizeof(detail), "%s, ",
 +                                av_get_colorspace_name(enc->colorspace));
 +            }
 +
 +            if (enc->field_order != AV_FIELD_UNKNOWN) {
 +                const char *field_order = "progressive";
 +                if (enc->field_order == AV_FIELD_TT)
 +                    field_order = "top first";
 +                else if (enc->field_order == AV_FIELD_BB)
 +                    field_order = "bottom first";
 +                else if (enc->field_order == AV_FIELD_TB)
 +                    field_order = "top coded first (swapped)";
 +                else if (enc->field_order == AV_FIELD_BT)
 +                    field_order = "bottom coded first (swapped)";
 +
 +                av_strlcatf(detail, sizeof(detail), "%s, ", field_order);
 +            }
 +
 +            if (av_log_get_level() >= AV_LOG_VERBOSE &&
 +                enc->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED)
 +                av_strlcatf(detail, sizeof(detail), "%s, ",
 +                            av_chroma_location_name(enc->chroma_sample_location));
  
 -        if (enc->color_range != AVCOL_RANGE_UNSPECIFIED)
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf), ", %s",
 -                     av_color_range_name(enc->color_range));
 -        if (enc->colorspace != AVCOL_SPC_UNSPECIFIED ||
 -            enc->color_primaries != AVCOL_PRI_UNSPECIFIED ||
 -            enc->color_trc != AVCOL_TRC_UNSPECIFIED) {
 -            new_line = 1;
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf), ", %s/%s/%s",
 -                     av_color_space_name(enc->colorspace),
 -                     av_color_primaries_name(enc->color_primaries),
 -                     av_color_transfer_name(enc->color_trc));
 -        }
 -        if (av_log_get_level() >= AV_LOG_DEBUG &&
 -            enc->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED)
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf), ", %s",
 -                     av_chroma_location_name(enc->chroma_sample_location));
 +            if (strlen(detail) > 1) {
 +                detail[strlen(detail) - 2] = 0;
 +                av_strlcatf(buf, buf_size, "%s)", detail);
 +            }
 +        }
  
          if (enc->width) {
 -            av_strlcat(buf, new_line ? "\n      " : ", ", buf_size);
 +            av_strlcat(buf, new_line ? separator : ", ", buf_size);
  
              snprintf(buf + strlen(buf), buf_size - strlen(buf),
                       "%dx%d",
  
              if (enc->sample_aspect_ratio.num) {
                  av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
 -                          enc->width * enc->sample_aspect_ratio.num,
 -                          enc->height * enc->sample_aspect_ratio.den,
 +                          enc->width * (int64_t)enc->sample_aspect_ratio.num,
 +                          enc->height * (int64_t)enc->sample_aspect_ratio.den,
                            1024 * 1024);
                  snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                         " [PAR %d:%d DAR %d:%d]",
 +                         " [SAR %d:%d DAR %d:%d]",
                           enc->sample_aspect_ratio.num, enc->sample_aspect_ratio.den,
                           display_aspect_ratio.num, display_aspect_ratio.den);
              }
          if (encode) {
              snprintf(buf + strlen(buf), buf_size - strlen(buf),
                       ", q=%d-%d", enc->qmin, enc->qmax);
 +        } else {
 +            if (enc->properties & FF_CODEC_PROPERTY_CLOSED_CAPTIONS)
 +                snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                         ", Closed Captions");
 +            if (enc->properties & FF_CODEC_PROPERTY_LOSSLESS)
 +                snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                         ", lossless");
          }
          break;
      case AVMEDIA_TYPE_AUDIO:
 -        snprintf(buf, buf_size,
 -                 "Audio: %s",
 -                 codec_name);
 -        if (profile)
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                     " (%s)", profile);
 -        if (enc->codec_tag) {
 -            char tag_buf[32];
 -            av_get_codec_tag_string(tag_buf, sizeof(tag_buf), enc->codec_tag);
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                     " [%s / 0x%04X]", tag_buf, enc->codec_tag);
 -        }
 +        av_strlcat(buf, separator, buf_size);
  
 -        av_strlcat(buf, "\n      ", buf_size);
          if (enc->sample_rate) {
              snprintf(buf + strlen(buf), buf_size - strlen(buf),
                       "%d Hz, ", enc->sample_rate);
              snprintf(buf + strlen(buf), buf_size - strlen(buf),
                       ", %s", av_get_sample_fmt_name(enc->sample_fmt));
          }
 +        if (   enc->bits_per_raw_sample > 0
 +            && enc->bits_per_raw_sample != av_get_bytes_per_sample(enc->sample_fmt) * 8)
 +            snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                     " (%d bit)", enc->bits_per_raw_sample);
 +        if (av_log_get_level() >= AV_LOG_VERBOSE) {
 +            if (enc->initial_padding)
 +                snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                         ", delay %d", enc->initial_padding);
 +            if (enc->trailing_padding)
 +                snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                         ", padding %d", enc->trailing_padding);
 +        }
          break;
      case AVMEDIA_TYPE_DATA:
 -        snprintf(buf, buf_size, "Data: %s", codec_name);
 +        if (av_log_get_level() >= AV_LOG_DEBUG) {
 +            int g = av_gcd(enc->time_base.num, enc->time_base.den);
 +            if (g)
 +                snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                         ", %d/%d",
 +                         enc->time_base.num / g, enc->time_base.den / g);
 +        }
          break;
      case AVMEDIA_TYPE_SUBTITLE:
 -        snprintf(buf, buf_size, "Subtitle: %s", codec_name);
 -        break;
 -    case AVMEDIA_TYPE_ATTACHMENT:
 -        snprintf(buf, buf_size, "Attachment: %s", codec_name);
 +        if (enc->width)
 +            snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                     ", %dx%d", enc->width, enc->height);
          break;
      default:
 -        snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type);
          return;
      }
      if (encode) {
      bitrate = get_bit_rate(enc);
      if (bitrate != 0) {
          snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                 ", %d kb/s", bitrate / 1000);
 +                 ", %"PRId64" kb/s", bitrate / 1000);
 +    } else if (enc->rc_max_rate > 0) {
 +        snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                 ", max. %"PRId64" kb/s", (int64_t)enc->rc_max_rate / 1000);
      }
  }
  
@@@ -3450,25 -1939,18 +3026,25 @@@ const char *avcodec_profile_name(enum A
  
  unsigned avcodec_version(void)
  {
 +//    av_assert0(AV_CODEC_ID_V410==164);
 +    av_assert0(AV_CODEC_ID_PCM_S8_PLANAR==65563);
 +    av_assert0(AV_CODEC_ID_ADPCM_G722==69660);
 +//     av_assert0(AV_CODEC_ID_BMV_AUDIO==86071);
 +    av_assert0(AV_CODEC_ID_SRT==94216);
 +    av_assert0(LIBAVCODEC_VERSION_MICRO >= 100);
 +
      return LIBAVCODEC_VERSION_INT;
  }
  
  const char *avcodec_configuration(void)
  {
 -    return LIBAV_CONFIGURATION;
 +    return FFMPEG_CONFIGURATION;
  }
  
  const char *avcodec_license(void)
  {
  #define LICENSE_PREFIX "libavcodec license: "
 -    return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
 +    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
  }
  
  void avcodec_flush_buffers(AVCodecContext *avctx)
      else if (avctx->codec->flush)
          avctx->codec->flush(avctx);
  
 +    avctx->pts_correction_last_pts =
 +    avctx->pts_correction_last_dts = INT64_MIN;
 +
      if (!avctx->refcounted_frames)
          av_frame_unref(avctx->internal->to_free);
  }
  int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
  {
      switch (codec_id) {
 +    case AV_CODEC_ID_8SVX_EXP:
 +    case AV_CODEC_ID_8SVX_FIB:
      case AV_CODEC_ID_ADPCM_CT:
      case AV_CODEC_ID_ADPCM_IMA_APC:
      case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
 +    case AV_CODEC_ID_ADPCM_IMA_OKI:
      case AV_CODEC_ID_ADPCM_IMA_WS:
      case AV_CODEC_ID_ADPCM_G722:
      case AV_CODEC_ID_ADPCM_YAMAHA:
 +    case AV_CODEC_ID_ADPCM_AICA:
          return 4;
 +    case AV_CODEC_ID_DSD_LSBF:
 +    case AV_CODEC_ID_DSD_MSBF:
 +    case AV_CODEC_ID_DSD_LSBF_PLANAR:
 +    case AV_CODEC_ID_DSD_MSBF_PLANAR:
      case AV_CODEC_ID_PCM_ALAW:
      case AV_CODEC_ID_PCM_MULAW:
      case AV_CODEC_ID_PCM_S8:
 +    case AV_CODEC_ID_PCM_S8_PLANAR:
      case AV_CODEC_ID_PCM_U8:
      case AV_CODEC_ID_PCM_ZORK:
 +    case AV_CODEC_ID_SDX2_DPCM:
          return 8;
      case AV_CODEC_ID_PCM_S16BE:
      case AV_CODEC_ID_PCM_S16BE_PLANAR:
      case AV_CODEC_ID_PCM_U32LE:
      case AV_CODEC_ID_PCM_F32BE:
      case AV_CODEC_ID_PCM_F32LE:
 +    case AV_CODEC_ID_PCM_F24LE:
 +    case AV_CODEC_ID_PCM_F16LE:
          return 32;
      case AV_CODEC_ID_PCM_F64BE:
      case AV_CODEC_ID_PCM_F64LE:
 +    case AV_CODEC_ID_PCM_S64BE:
 +    case AV_CODEC_ID_PCM_S64LE:
          return 64;
      default:
          return 0;
      }
  }
  
 +enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be)
 +{
 +    static const enum AVCodecID map[AV_SAMPLE_FMT_NB][2] = {
 +        [AV_SAMPLE_FMT_U8  ] = { AV_CODEC_ID_PCM_U8,    AV_CODEC_ID_PCM_U8    },
 +        [AV_SAMPLE_FMT_S16 ] = { AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE },
 +        [AV_SAMPLE_FMT_S32 ] = { AV_CODEC_ID_PCM_S32LE, AV_CODEC_ID_PCM_S32BE },
 +        [AV_SAMPLE_FMT_FLT ] = { AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_F32BE },
 +        [AV_SAMPLE_FMT_DBL ] = { AV_CODEC_ID_PCM_F64LE, AV_CODEC_ID_PCM_F64BE },
 +        [AV_SAMPLE_FMT_U8P ] = { AV_CODEC_ID_PCM_U8,    AV_CODEC_ID_PCM_U8    },
 +        [AV_SAMPLE_FMT_S16P] = { AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE },
 +        [AV_SAMPLE_FMT_S32P] = { AV_CODEC_ID_PCM_S32LE, AV_CODEC_ID_PCM_S32BE },
 +        [AV_SAMPLE_FMT_S64P] = { AV_CODEC_ID_PCM_S64LE, AV_CODEC_ID_PCM_S64BE },
 +        [AV_SAMPLE_FMT_FLTP] = { AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_F32BE },
 +        [AV_SAMPLE_FMT_DBLP] = { AV_CODEC_ID_PCM_F64LE, AV_CODEC_ID_PCM_F64BE },
 +    };
 +    if (fmt < 0 || fmt >= AV_SAMPLE_FMT_NB)
 +        return AV_CODEC_ID_NONE;
 +    if (be < 0 || be > 1)
 +        be = AV_NE(1, 0);
 +    return map[fmt][be];
 +}
 +
  int av_get_bits_per_sample(enum AVCodecID codec_id)
  {
      switch (codec_id) {
  }
  
  static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba,
 -                                    uint32_t tag, int bits_per_coded_sample, int frame_bytes)
 +                                    uint32_t tag, int bits_per_coded_sample, int64_t bitrate,
 +                                    uint8_t * extradata, int frame_size, int frame_bytes)
  {
      int bps = av_get_exact_bits_per_sample(id);
 +    int framecount = (ba > 0 && frame_bytes / ba > 0) ? frame_bytes / ba : 1;
  
      /* codecs with an exact constant bits per sample */
 -    if (bps > 0 && ch > 0 && frame_bytes > 0)
 -        return (frame_bytes * 8) / (bps * ch);
 +    if (bps > 0 && ch > 0 && frame_bytes > 0 && ch < 32768 && bps < 32768)
 +        return (frame_bytes * 8LL) / (bps * ch);
      bps = bits_per_coded_sample;
  
      /* codecs with a fixed packet duration */
      case AV_CODEC_ID_ADPCM_IMA_QT: return   64;
      case AV_CODEC_ID_ADPCM_EA_XAS: return  128;
      case AV_CODEC_ID_AMR_NB:
 +    case AV_CODEC_ID_EVRC:
      case AV_CODEC_ID_GSM:
      case AV_CODEC_ID_QCELP:
 -    case AV_CODEC_ID_RA_144:
      case AV_CODEC_ID_RA_288:       return  160;
 -    case AV_CODEC_ID_IMC:          return  256;
      case AV_CODEC_ID_AMR_WB:
      case AV_CODEC_ID_GSM_MS:       return  320;
      case AV_CODEC_ID_MP1:          return  384;
      case AV_CODEC_ID_ATRAC1:       return  512;
 -    case AV_CODEC_ID_ATRAC3:       return 1024;
 +    case AV_CODEC_ID_ATRAC3:       return 1024 * framecount;
 +    case AV_CODEC_ID_ATRAC3P:      return 2048;
      case AV_CODEC_ID_MP2:
      case AV_CODEC_ID_MUSEPACK7:    return 1152;
      case AV_CODEC_ID_AC3:          return 1536;
          /* calc from sample rate */
          if (id == AV_CODEC_ID_TTA)
              return 256 * sr / 245;
 +        else if (id == AV_CODEC_ID_DST)
 +            return 588 * sr / 44100;
  
          if (ch > 0) {
              /* calc from sample rate and channels */
              return 240 * (frame_bytes / 32);
          if (id == AV_CODEC_ID_NELLYMOSER)
              return 256 * (frame_bytes / 64);
 +        if (id == AV_CODEC_ID_RA_144)
 +            return 160 * (frame_bytes / 20);
 +        if (id == AV_CODEC_ID_G723_1)
 +            return 240 * (frame_bytes / 24);
  
          if (bps > 0) {
              /* calc from frame_bytes and bits_per_coded_sample */
                  return frame_bytes * 8 / bps;
          }
  
 -        if (ch > 0) {
 +        if (ch > 0 && ch < INT_MAX/16) {
              /* calc from frame_bytes and channels */
              switch (id) {
 +            case AV_CODEC_ID_ADPCM_AFC:
 +                return frame_bytes / (9 * ch) * 16;
 +            case AV_CODEC_ID_ADPCM_PSX:
 +            case AV_CODEC_ID_ADPCM_DTK:
 +                return frame_bytes / (16 * ch) * 28;
              case AV_CODEC_ID_ADPCM_4XM:
 +            case AV_CODEC_ID_ADPCM_IMA_DAT4:
              case AV_CODEC_ID_ADPCM_IMA_ISS:
                  return (frame_bytes - 4 * ch) * 2 / ch;
              case AV_CODEC_ID_ADPCM_IMA_SMJPEG:
                  return (frame_bytes - 4) * 2 / ch;
              case AV_CODEC_ID_ADPCM_IMA_AMV:
                  return (frame_bytes - 8) * 2 / ch;
 +            case AV_CODEC_ID_ADPCM_THP:
 +            case AV_CODEC_ID_ADPCM_THP_LE:
 +                if (extradata)
 +                    return frame_bytes * 14 / (8 * ch);
 +                break;
              case AV_CODEC_ID_ADPCM_XA:
                  return (frame_bytes / 128) * 224 / ch;
              case AV_CODEC_ID_INTERPLAY_DPCM:
                  return 6 * frame_bytes / ch;
              case AV_CODEC_ID_PCM_LXF:
                  return 2 * (frame_bytes / (5 * ch));
 +            case AV_CODEC_ID_IAC:
 +            case AV_CODEC_ID_IMC:
 +                return 4 * frame_bytes / ch;
              }
  
              if (tag) {
                  int blocks = frame_bytes / ba;
                  switch (id) {
                  case AV_CODEC_ID_ADPCM_IMA_WAV:
 -                    return blocks * (1 + (ba - 4 * ch) / (4 * ch) * 8);
 +                    if (bps < 2 || bps > 5)
 +                        return 0;
 +                    return blocks * (1 + (ba - 4 * ch) / (bps * ch) * 8);
                  case AV_CODEC_ID_ADPCM_IMA_DK3:
                      return blocks * (((ba - 16) * 2 / 3 * 4) / ch);
                  case AV_CODEC_ID_ADPCM_IMA_DK4:
                      return blocks * (1 + (ba - 4 * ch) * 2 / ch);
 +                case AV_CODEC_ID_ADPCM_IMA_RAD:
 +                    return blocks * ((ba - 4 * ch) * 2 / ch);
                  case AV_CODEC_ID_ADPCM_MS:
                      return blocks * (2 + (ba - 7 * ch) * 2 / ch);
 +                case AV_CODEC_ID_ADPCM_MTAF:
 +                    return blocks * (ba - 16) * 2 / ch;
                  }
              }
  
                  /* calc from frame_bytes, channels, and bits_per_coded_sample */
                  switch (id) {
                  case AV_CODEC_ID_PCM_DVD:
 +                    if(bps<4)
 +                        return 0;
                      return 2 * (frame_bytes / ((bps * 2 / 8) * ch));
                  case AV_CODEC_ID_PCM_BLURAY:
 +                    if(bps<4)
 +                        return 0;
                      return frame_bytes / ((FFALIGN(ch, 2) * bps) / 8);
                  case AV_CODEC_ID_S302M:
                      return 2 * (frame_bytes / ((bps + 4) / 4)) / ch;
          }
      }
  
 +    /* Fall back on using frame_size */
 +    if (frame_size > 1 && frame_bytes)
 +        return frame_size;
 +
 +    //For WMA we currently have no other means to calculate duration thus we
 +    //do it here by assuming CBR, which is true for all known cases.
 +    if (bitrate > 0 && frame_bytes > 0 && sr > 0 && ba > 1) {
 +        if (id == AV_CODEC_ID_WMAV1 || id == AV_CODEC_ID_WMAV2)
 +            return  (frame_bytes * 8LL * sr) / bitrate;
 +    }
 +
      return 0;
  }
  
@@@ -3780,7 -2180,6 +3356,7 @@@ int av_get_audio_frame_duration(AVCodec
      return get_audio_frame_duration(avctx->codec_id, avctx->sample_rate,
                                      avctx->channels, avctx->block_align,
                                      avctx->codec_tag, avctx->bits_per_coded_sample,
 +                                    avctx->bit_rate, avctx->extradata, avctx->frame_size,
                                      frame_bytes);
  }
  
@@@ -3789,7 -2188,6 +3365,7 @@@ int av_get_audio_frame_duration2(AVCode
      return get_audio_frame_duration(par->codec_id, par->sample_rate,
                                      par->channels, par->block_align,
                                      par->codec_tag, par->bits_per_coded_sample,
 +                                    par->bit_rate, par->extradata, par->frame_size,
                                      frame_bytes);
  }
  
@@@ -3826,7 -2224,7 +3402,7 @@@ int ff_match_2uint16(const uint16_t(*ta
  FF_DISABLE_DEPRECATION_WARNINGS
  void av_log_missing_feature(void *avc, const char *feature, int want_sample)
  {
 -    av_log(avc, AV_LOG_WARNING, "%s is not implemented. Update your Libav "
 +    av_log(avc, AV_LOG_WARNING, "%s is not implemented. Update your FFmpeg "
              "version to the newest one from Git. If the problem still "
              "occurs, it means that your file has a feature which has not "
              "been implemented.\n", feature);
@@@ -3843,8 -2241,8 +3419,8 @@@ void av_log_ask_for_sample(void *avc, c
      if (msg)
          av_vlog(avc, AV_LOG_WARNING, msg, argument_list);
      av_log(avc, AV_LOG_WARNING, "If you want to help, upload a sample "
 -            "of this file to ftp://upload.libav.org/incoming/ "
 -            "and contact the libav-devel mailing list.\n");
 +            "of this file to ftp://upload.ffmpeg.org/incoming/ "
 +            "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)\n");
  
      va_end(argument_list);
  }
@@@ -3852,15 -2250,14 +3428,15 @@@ FF_ENABLE_DEPRECATION_WARNING
  #endif /* FF_API_MISSING_SAMPLE */
  
  static AVHWAccel *first_hwaccel = NULL;
 +static AVHWAccel **last_hwaccel = &first_hwaccel;
  
  void av_register_hwaccel(AVHWAccel *hwaccel)
  {
 -    AVHWAccel **p = &first_hwaccel;
 -    while (*p)
 -        p = &(*p)->next;
 -    *p = hwaccel;
 +    AVHWAccel **p = last_hwaccel;
      hwaccel->next = NULL;
 +    while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, hwaccel))
 +        p = &(*p)->next;
 +    last_hwaccel = &hwaccel->next;
  }
  
  AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel)
@@@ -3900,48 -2297,6 +3476,48 @@@ int av_lockmgr_register(int (*cb)(void 
      return 0;
  }
  
 +int ff_lock_avcodec(AVCodecContext *log_ctx, const AVCodec *codec)
 +{
 +    if (codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE || !codec->init)
 +        return 0;
 +
 +    if (lockmgr_cb) {
 +        if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
 +            return -1;
 +    }
 +
 +    if (avpriv_atomic_int_add_and_fetch(&entangled_thread_counter, 1) != 1) {
 +        av_log(log_ctx, AV_LOG_ERROR,
 +               "Insufficient thread locking. At least %d threads are "
 +               "calling avcodec_open2() at the same time right now.\n",
 +               entangled_thread_counter);
 +        if (!lockmgr_cb)
 +            av_log(log_ctx, AV_LOG_ERROR, "No lock manager is set, please see av_lockmgr_register()\n");
 +        ff_avcodec_locked = 1;
 +        ff_unlock_avcodec(codec);
 +        return AVERROR(EINVAL);
 +    }
 +    av_assert0(!ff_avcodec_locked);
 +    ff_avcodec_locked = 1;
 +    return 0;
 +}
 +
 +int ff_unlock_avcodec(const AVCodec *codec)
 +{
 +    if (codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE || !codec->init)
 +        return 0;
 +
 +    av_assert0(ff_avcodec_locked);
 +    ff_avcodec_locked = 0;
 +    avpriv_atomic_int_add_and_fetch(&entangled_thread_counter, -1);
 +    if (lockmgr_cb) {
 +        if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE))
 +            return -1;
 +    }
 +
 +    return 0;
 +}
 +
  int avpriv_lock_avformat(void)
  {
      if (lockmgr_cb) {
@@@ -3965,25 -2320,22 +3541,25 @@@ unsigned int avpriv_toupper4(unsigned i
      return av_toupper(x & 0xFF) +
            (av_toupper((x >>  8) & 0xFF) << 8)  +
            (av_toupper((x >> 16) & 0xFF) << 16) +
 -          (av_toupper((x >> 24) & 0xFF) << 24);
 +((unsigned)av_toupper((x >> 24) & 0xFF) << 24);
  }
  
  int ff_thread_ref_frame(ThreadFrame *dst, ThreadFrame *src)
  {
      int ret;
  
 -    dst->owner = src->owner;
 +    dst->owner[0] = src->owner[0];
 +    dst->owner[1] = src->owner[1];
  
      ret = av_frame_ref(dst->f, src->f);
      if (ret < 0)
          return ret;
  
 +    av_assert0(!dst->progress);
 +
      if (src->progress &&
          !(dst->progress = av_buffer_ref(src->progress))) {
 -        ff_thread_release_buffer(dst->owner, dst);
 +        ff_thread_release_buffer(dst->owner[0], dst);
          return AVERROR(ENOMEM);
      }
  
  
  #if !HAVE_THREADS
  
 +enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
 +{
 +    return ff_get_format(avctx, fmt);
 +}
 +
  int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
  {
 -    f->owner = avctx;
 +    f->owner[0] = f->owner[1] = avctx;
      return ff_get_buffer(avctx, f->f, flags);
  }
  
@@@ -4021,28 -2368,6 +3597,28 @@@ void ff_thread_await_progress(ThreadFra
  {
  }
  
 +int ff_thread_can_start_frame(AVCodecContext *avctx)
 +{
 +    return 1;
 +}
 +
 +int ff_alloc_entries(AVCodecContext *avctx, int count)
 +{
 +    return 0;
 +}
 +
 +void ff_reset_entries(AVCodecContext *avctx)
 +{
 +}
 +
 +void ff_thread_await_progress2(AVCodecContext *avctx, int field, int thread, int shift)
 +{
 +}
 +
 +void ff_thread_report_progress2(AVCodecContext *avctx, int field, int thread, int n)
 +{
 +}
 +
  #endif
  
  int avcodec_is_open(AVCodecContext *s)
      return !!s->internal;
  }
  
 -const uint8_t *avpriv_find_start_code(const uint8_t *restrict p,
 +int avpriv_bprint_to_extradata(AVCodecContext *avctx, struct AVBPrint *buf)
 +{
 +    int ret;
 +    char *str;
 +
 +    ret = av_bprint_finalize(buf, &str);
 +    if (ret < 0)
 +        return ret;
 +    if (!av_bprint_is_complete(buf)) {
 +        av_free(str);
 +        return AVERROR(ENOMEM);
 +    }
 +
 +    avctx->extradata = str;
 +    /* Note: the string is NUL terminated (so extradata can be read as a
 +     * string), but the ending character is not accounted in the size (in
 +     * binary formats you are likely not supposed to mux that character). When
 +     * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE
 +     * zeros. */
 +    avctx->extradata_size = buf->len;
 +    return 0;
 +}
 +
 +const uint8_t *avpriv_find_start_code(const uint8_t *av_restrict p,
                                        const uint8_t *end,
 -                                      uint32_t * restrict state)
 +                                      uint32_t *av_restrict state)
  {
      int i;
  
 -    assert(p <= end);
 +    av_assert0(p <= end);
      if (p >= end)
          return end;
  
@@@ -4162,8 -2464,6 +3738,8 @@@ static void codec_parameters_reset(AVCo
      par->color_space         = AVCOL_SPC_UNSPECIFIED;
      par->chroma_location     = AVCHROMA_LOC_UNSPECIFIED;
      par->sample_aspect_ratio = (AVRational){ 0, 1 };
 +    par->profile             = FF_PROFILE_UNKNOWN;
 +    par->level               = FF_LEVEL_UNKNOWN;
  }
  
  AVCodecParameters *avcodec_parameters_alloc(void)
@@@ -4216,7 -2516,6 +3792,7 @@@ int avcodec_parameters_from_context(AVC
  
      par->bit_rate              = codec->bit_rate;
      par->bits_per_coded_sample = codec->bits_per_coded_sample;
 +    par->bits_per_raw_sample   = codec->bits_per_raw_sample;
      par->profile               = codec->profile;
      par->level                 = codec->level;
  
          par->color_space         = codec->colorspace;
          par->chroma_location     = codec->chroma_sample_location;
          par->sample_aspect_ratio = codec->sample_aspect_ratio;
 +        par->video_delay         = codec->has_b_frames;
          break;
      case AVMEDIA_TYPE_AUDIO:
 -        par->format          = codec->sample_fmt;
 -        par->channel_layout  = codec->channel_layout;
 -        par->channels        = codec->channels;
 -        par->sample_rate     = codec->sample_rate;
 -        par->block_align     = codec->block_align;
 -        par->initial_padding = codec->initial_padding;
 +        par->format           = codec->sample_fmt;
 +        par->channel_layout   = codec->channel_layout;
 +        par->channels         = codec->channels;
 +        par->sample_rate      = codec->sample_rate;
 +        par->block_align      = codec->block_align;
 +        par->frame_size       = codec->frame_size;
 +        par->initial_padding  = codec->initial_padding;
 +        par->trailing_padding = codec->trailing_padding;
 +        par->seek_preroll     = codec->seek_preroll;
 +        break;
 +    case AVMEDIA_TYPE_SUBTITLE:
 +        par->width  = codec->width;
 +        par->height = codec->height;
          break;
      }
  
@@@ -4271,7 -2562,6 +3847,7 @@@ int avcodec_parameters_to_context(AVCod
  
      codec->bit_rate              = par->bit_rate;
      codec->bits_per_coded_sample = par->bits_per_coded_sample;
 +    codec->bits_per_raw_sample   = par->bits_per_raw_sample;
      codec->profile               = par->profile;
      codec->level                 = par->level;
  
          codec->colorspace             = par->color_space;
          codec->chroma_sample_location = par->chroma_location;
          codec->sample_aspect_ratio    = par->sample_aspect_ratio;
 +        codec->has_b_frames           = par->video_delay;
          break;
      case AVMEDIA_TYPE_AUDIO:
 -        codec->sample_fmt      = par->format;
 -        codec->channel_layout  = par->channel_layout;
 -        codec->channels        = par->channels;
 -        codec->sample_rate     = par->sample_rate;
 -        codec->block_align     = par->block_align;
 -        codec->initial_padding = par->initial_padding;
 +        codec->sample_fmt       = par->format;
 +        codec->channel_layout   = par->channel_layout;
 +        codec->channels         = par->channels;
 +        codec->sample_rate      = par->sample_rate;
 +        codec->block_align      = par->block_align;
 +        codec->frame_size       = par->frame_size;
 +        codec->delay            =
 +        codec->initial_padding  = par->initial_padding;
 +        codec->trailing_padding = par->trailing_padding;
 +        codec->seek_preroll     = par->seek_preroll;
 +        break;
 +    case AVMEDIA_TYPE_SUBTITLE:
 +        codec->width  = par->width;
 +        codec->height = par->height;
          break;
      }
  
  
      return 0;
  }
 +
 +int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len,
 +                     void **data, size_t *sei_size)
 +{
 +    AVFrameSideData *side_data = NULL;
 +    uint8_t *sei_data;
 +
 +    if (frame)
 +        side_data = av_frame_get_side_data(frame, AV_FRAME_DATA_A53_CC);
 +
 +    if (!side_data) {
 +        *data = NULL;
 +        return 0;
 +    }
 +
 +    *sei_size = side_data->size + 11;
 +    *data = av_mallocz(*sei_size + prefix_len);
 +    if (!*data)
 +        return AVERROR(ENOMEM);
 +    sei_data = (uint8_t*)*data + prefix_len;
 +
 +    // country code
 +    sei_data[0] = 181;
 +    sei_data[1] = 0;
 +    sei_data[2] = 49;
 +
 +    /**
 +     * 'GA94' is standard in North America for ATSC, but hard coding
 +     * this style may not be the right thing to do -- other formats
 +     * do exist. This information is not available in the side_data
 +     * so we are going with this right now.
 +     */
 +    AV_WL32(sei_data + 3, MKTAG('G', 'A', '9', '4'));
 +    sei_data[7] = 3;
 +    sei_data[8] = ((side_data->size/3) & 0x1f) | 0x40;
 +    sei_data[9] = 0;
 +
 +    memcpy(sei_data + 10, side_data->data, side_data->size);
 +
 +    sei_data[side_data->size+10] = 255;
 +
 +    return 0;
 +}
 +
 +int64_t ff_guess_coded_bitrate(AVCodecContext *avctx)
 +{
 +    AVRational framerate = avctx->framerate;
 +    int bits_per_coded_sample = avctx->bits_per_coded_sample;
 +    int64_t bitrate;
 +
 +    if (!(framerate.num && framerate.den))
 +        framerate = av_inv_q(avctx->time_base);
 +    if (!(framerate.num && framerate.den))
 +        return 0;
 +
 +    if (!bits_per_coded_sample) {
 +        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
 +        bits_per_coded_sample = av_get_bits_per_pixel(desc);
 +    }
 +    bitrate = (int64_t)bits_per_coded_sample * avctx->width * avctx->height *
 +              framerate.num / framerate.den;
 +
 +    return bitrate;
 +}