Index: Makefile
===================================================================
--- Makefile (nonexistent)
+++ Makefile (revision 377)
@@ -0,0 +1,1313 @@
+NAME = avcodec
+DESC = FFmpeg codec library
+
+HEADERS = ac3_parser.h \
+ adts_parser.h \
+ avcodec.h \
+ avdct.h \
+ avfft.h \
+ bsf.h \
+ codec.h \
+ codec_desc.h \
+ codec_id.h \
+ codec_par.h \
+ d3d11va.h \
+ dirac.h \
+ dv_profile.h \
+ dxva2.h \
+ jni.h \
+ mediacodec.h \
+ packet.h \
+ qsv.h \
+ vaapi.h \
+ vdpau.h \
+ version.h \
+ videotoolbox.h \
+ vorbis_parser.h \
+ xvmc.h \
+
+OBJS = ac3_parser.o \
+ adts_parser.o \
+ allcodecs.o \
+ avcodec.o \
+ avdct.o \
+ avpacket.o \
+ avpicture.o \
+ bitstream.o \
+ bitstream_filter.o \
+ bitstream_filters.o \
+ bsf.o \
+ codec_desc.o \
+ codec_par.o \
+ d3d11va.o \
+ decode.o \
+ dirac.o \
+ dv_profile.o \
+ encode.o \
+ imgconvert.o \
+ jni.o \
+ mathtables.o \
+ mediacodec.o \
+ mpeg12framerate.o \
+ options.o \
+ parser.o \
+ parsers.o \
+ profiles.o \
+ qsv_api.o \
+ raw.o \
+ utils.o \
+ vorbis_parser.o \
+ xiph.o \
+
+# subsystems
+OBJS-$(CONFIG_AANDCTTABLES) += aandcttab.o
+OBJS-$(CONFIG_AC3DSP) += ac3dsp.o ac3.o ac3tab.o
+OBJS-$(CONFIG_ADTS_HEADER) += adts_header.o mpeg4audio.o
+OBJS-$(CONFIG_AMF) += amfenc.o
+OBJS-$(CONFIG_AUDIO_FRAME_QUEUE) += audio_frame_queue.o
+OBJS-$(CONFIG_ATSC_A53) += atsc_a53.o
+OBJS-$(CONFIG_AUDIODSP) += audiodsp.o
+OBJS-$(CONFIG_BLOCKDSP) += blockdsp.o
+OBJS-$(CONFIG_BSWAPDSP) += bswapdsp.o
+OBJS-$(CONFIG_CABAC) += cabac.o
+OBJS-$(CONFIG_CBS) += cbs.o cbs_bsf.o
+OBJS-$(CONFIG_CBS_AV1) += cbs_av1.o
+OBJS-$(CONFIG_CBS_H264) += cbs_h2645.o cbs_sei.o h2645_parse.o
+OBJS-$(CONFIG_CBS_H265) += cbs_h2645.o cbs_sei.o h2645_parse.o
+OBJS-$(CONFIG_CBS_JPEG) += cbs_jpeg.o
+OBJS-$(CONFIG_CBS_MPEG2) += cbs_mpeg2.o
+OBJS-$(CONFIG_CBS_VP9) += cbs_vp9.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
+OBJS-$(CONFIG_FFT) += avfft.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
+OBJS-$(CONFIG_GOLOMB) += golomb.o
+OBJS-$(CONFIG_H263DSP) += h263dsp.o
+OBJS-$(CONFIG_H264CHROMA) += h264chroma.o
+OBJS-$(CONFIG_H264DSP) += h264dsp.o h264idct.o
+OBJS-$(CONFIG_H264PARSE) += h264_parse.o h2645_parse.o h264_ps.o
+OBJS-$(CONFIG_H264PRED) += h264pred.o
+OBJS-$(CONFIG_H264QPEL) += h264qpel.o
+OBJS-$(CONFIG_HEVCPARSE) += hevc_parse.o h2645_parse.o hevc_ps.o hevc_sei.o hevc_data.o \
+ dynamic_hdr10_plus.o
+OBJS-$(CONFIG_HPELDSP) += hpeldsp.o
+OBJS-$(CONFIG_HUFFMAN) += huffman.o
+OBJS-$(CONFIG_HUFFYUVDSP) += huffyuvdsp.o
+OBJS-$(CONFIG_HUFFYUVENCDSP) += huffyuvencdsp.o
+OBJS-$(CONFIG_IDCTDSP) += idctdsp.o simple_idct.o jrevdct.o
+OBJS-$(CONFIG_IIRFILTER) += iirfilter.o
+OBJS-$(CONFIG_MDCT15) += mdct15.o
+OBJS-$(CONFIG_INTRAX8) += intrax8.o intrax8dsp.o msmpeg4data.o
+OBJS-$(CONFIG_IVIDSP) += ivi_dsp.o
+OBJS-$(CONFIG_JNI) += ffjni.o jni.o
+OBJS-$(CONFIG_JPEGTABLES) += jpegtables.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_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 mpegaudiodec_common.o
+OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \
+ mpegaudiodsp_data.o \
+ mpegaudiodsp_fixed.o \
+ mpegaudiodsp_float.o
+OBJS-$(CONFIG_MPEGAUDIOHEADER) += mpegaudiodecheader.o mpegaudiodata.o
+OBJS-$(CONFIG_MPEGVIDEO) += mpegvideo.o mpegvideodsp.o rl.o \
+ mpegvideo_motion.o mpegutils.o \
+ mpegvideodata.o mpegpicture.o
+OBJS-$(CONFIG_MPEGVIDEOENC) += mpegvideo_enc.o mpeg12data.o \
+ motion_est.o ratecontrol.o \
+ mpegvideoencdsp.o
+OBJS-$(CONFIG_MSS34DSP) += mss34dsp.o
+OBJS-$(CONFIG_PIXBLOCKDSP) += pixblockdsp.o
+OBJS-$(CONFIG_QPELDSP) += qpeldsp.o
+OBJS-$(CONFIG_QSV) += qsv.o
+OBJS-$(CONFIG_QSVDEC) += qsvdec.o
+OBJS-$(CONFIG_QSVENC) += qsvenc.o
+OBJS-$(CONFIG_RANGECODER) += rangecoder.o
+OBJS-$(CONFIG_RDFT) += rdft.o
+OBJS-$(CONFIG_RV34DSP) += rv34dsp.o
+OBJS-$(CONFIG_SHARED) += log2_tab.o reverse.o
+OBJS-$(CONFIG_SINEWIN) += sinewin.o
+OBJS-$(CONFIG_SNAPPY) += snappy.o
+OBJS-$(CONFIG_STARTCODE) += startcode.o
+OBJS-$(CONFIG_TEXTUREDSP) += texturedsp.o
+OBJS-$(CONFIG_TEXTUREDSPENC) += texturedspenc.o
+OBJS-$(CONFIG_TPELDSP) += tpeldsp.o
+OBJS-$(CONFIG_VAAPI_ENCODE) += vaapi_encode.o
+OBJS-$(CONFIG_VC1DSP) += vc1dsp.o
+OBJS-$(CONFIG_VIDEODSP) += videodsp.o
+OBJS-$(CONFIG_VP3DSP) += vp3dsp.o
+OBJS-$(CONFIG_VP56DSP) += vp56dsp.o
+OBJS-$(CONFIG_VP8DSP) += vp8dsp.o
+OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o
+OBJS-$(CONFIG_WMA_FREQS) += wma_freqs.o
+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_common.o aacps_float.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_common.o aacps_fixed.o \
+ mpeg4audio.o kbdwin.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 \
+ aacenc_is.o \
+ aacenc_tns.o \
+ aacenc_ltp.o \
+ aacenc_pred.o \
+ psymodel.o mpeg4audio.o kbdwin.o
+OBJS-$(CONFIG_AAC_MF_ENCODER) += mfenc.o mf_utils.o
+OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o
+OBJS-$(CONFIG_AC3_DECODER) += ac3dec_float.o ac3dec_data.o ac3.o kbdwin.o ac3tab.o
+OBJS-$(CONFIG_AC3_FIXED_DECODER) += ac3dec_fixed.o ac3dec_data.o ac3.o kbdwin.o ac3tab.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 kbdwin.o
+OBJS-$(CONFIG_AC3_MF_ENCODER) += mfenc.o mf_utils.o
+OBJS-$(CONFIG_ACELP_KELVIN_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_AGM_DECODER) += agm.o
+OBJS-$(CONFIG_AIC_DECODER) += aic.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 mlz.o mpeg4audio.o
+OBJS-$(CONFIG_AMRNB_DECODER) += amrnbdec.o celp_filters.o \
+ celp_math.o acelp_filters.o \
+ acelp_vectors.o \
+ acelp_pitch_delay.o
+OBJS-$(CONFIG_AMRWB_DECODER) += amrwbdec.o celp_filters.o \
+ 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_APTX_DECODER) += aptxdec.o aptx.o
+OBJS-$(CONFIG_APTX_ENCODER) += aptxenc.o aptx.o
+OBJS-$(CONFIG_APTX_HD_DECODER) += aptxdec.o aptx.o
+OBJS-$(CONFIG_APTX_HD_ENCODER) += aptxenc.o aptx.o
+OBJS-$(CONFIG_APNG_DECODER) += png.o pngdec.o pngdsp.o
+OBJS-$(CONFIG_APNG_ENCODER) += png.o pngenc.o
+OBJS-$(CONFIG_ARBC_DECODER) += arbc.o
+OBJS-$(CONFIG_ARGO_DECODER) += argo.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
+OBJS-$(CONFIG_ASV1_ENCODER) += asvenc.o asv.o mpeg12data.o
+OBJS-$(CONFIG_ASV2_DECODER) += asvdec.o asv.o mpeg12data.o
+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_ATRAC9_DECODER) += atrac9dec.o
+OBJS-$(CONFIG_AURA_DECODER) += cyuv.o
+OBJS-$(CONFIG_AURA2_DECODER) += aura.o
+OBJS-$(CONFIG_AV1_DECODER) += av1dec.o
+OBJS-$(CONFIG_AV1_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_AVRN_DECODER) += avrndec.o
+OBJS-$(CONFIG_AVRP_DECODER) += r210dec.o
+OBJS-$(CONFIG_AVRP_ENCODER) += r210enc.o
+OBJS-$(CONFIG_AVS_DECODER) += avs.o
+OBJS-$(CONFIG_AVS_OMX_DECODER) += omxdec.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
+OBJS-$(CONFIG_BMV_VIDEO_DECODER) += bmvvideo.o
+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
+OBJS-$(CONFIG_CCAPTION_DECODER) += ccaption_dec.o ass.o
+OBJS-$(CONFIG_CDGRAPHICS_DECODER) += cdgraphics.o
+OBJS-$(CONFIG_CDTOONS_DECODER) += cdtoons.o
+OBJS-$(CONFIG_CDXL_DECODER) += cdxl.o
+OBJS-$(CONFIG_CFHD_DECODER) += cfhd.o cfhddata.o cfhddsp.o
+OBJS-$(CONFIG_CFHD_ENCODER) += cfhdenc.o cfhddata.o cfhdencdsp.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_CRI_DECODER) += cri.o
+OBJS-$(CONFIG_CSCD_DECODER) += cscd.o
+OBJS-$(CONFIG_CYUV_DECODER) += cyuv.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 dcadata.o dcahuff.o \
+ dcaadpcm.o
+OBJS-$(CONFIG_DDS_DECODER) += dds.o
+OBJS-$(CONFIG_DERF_DPCM_DECODER) += dpcm.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_DOLBY_E_DECODER) += dolby_e.o dolby_e_parse.o kbdwin.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) += dvbsubenc.o
+OBJS-$(CONFIG_DVDSUB_DECODER) += dvdsubdec.o dvdsub.o
+OBJS-$(CONFIG_DVDSUB_ENCODER) += dvdsubenc.o dvdsub.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) += 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 \
+ mpeg12data.o
+OBJS-$(CONFIG_EATGQ_DECODER) += eatgq.o eaidct.o
+OBJS-$(CONFIG_EATGV_DECODER) += eatgv.o
+OBJS-$(CONFIG_EATQI_DECODER) += eatqi.o eaidct.o mpeg12.o mpeg12data.o mpegvideodata.o rl.o
+OBJS-$(CONFIG_EIGHTBPS_DECODER) += 8bps.o
+OBJS-$(CONFIG_EIGHTSVX_EXP_DECODER) += 8svx.o
+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 exrdsp.o
+OBJS-$(CONFIG_EXR_ENCODER) += exrenc.o
+OBJS-$(CONFIG_FASTAUDIO_DECODER) += fastaudio.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_FITS_DECODER) += fitsdec.o fits.o
+OBJS-$(CONFIG_FITS_ENCODER) += fitsenc.o
+OBJS-$(CONFIG_FLAC_DECODER) += flacdec.o flacdata.o flac.o
+OBJS-$(CONFIG_FLAC_ENCODER) += flacenc.o flacdata.o flac.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_FLV_DECODER) += flvdec.o
+OBJS-$(CONFIG_FLV_ENCODER) += flvenc.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 mjpegdec_common.o
+OBJS-$(CONFIG_G723_1_DECODER) += g723_1dec.o g723_1.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
+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_GDV_DECODER) += gdv.o
+OBJS-$(CONFIG_GIF_DECODER) += gifdec.o lzw.o
+OBJS-$(CONFIG_GIF_ENCODER) += gif.o lzwenc.o
+OBJS-$(CONFIG_GREMLIN_DPCM_DECODER) += dpcm.o
+OBJS-$(CONFIG_GSM_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o
+OBJS-$(CONFIG_GSM_MS_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o
+OBJS-$(CONFIG_H261_DECODER) += h261dec.o h261data.o h261.o
+OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261data.o h261.o
+OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o ituh263dec.o \
+ mpeg4video.o mpeg4videodec.o \
+ h263data.o
+OBJS-$(CONFIG_H263I_DECODER) += intelh263dec.o
+OBJS-$(CONFIG_H263_ENCODER) += mpeg4video.o \
+ h263.o ituh263enc.o h263data.o
+OBJS-$(CONFIG_H263_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_H263_V4L2M2M_DECODER) += v4l2_m2m_dec.o
+OBJS-$(CONFIG_H263_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
+OBJS-$(CONFIG_H264_DECODER) += h264dec.o h264_cabac.o h264_cavlc.o \
+ h264_direct.o h264_loopfilter.o \
+ h264_mb.o h264_picture.o \
+ h264_refs.o h264_sei.o \
+ h264_slice.o h264data.o
+OBJS-$(CONFIG_H264_AMF_ENCODER) += amfenc_h264.o
+OBJS-$(CONFIG_H264_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_H264_MEDIACODEC_DECODER) += mediacodecdec.o
+OBJS-$(CONFIG_H264_MF_ENCODER) += mfenc.o mf_utils.o
+OBJS-$(CONFIG_H264_MMAL_DECODER) += mmaldec.o
+OBJS-$(CONFIG_H264_NVENC_ENCODER) += nvenc.o nvenc_h264.o
+OBJS-$(CONFIG_NVENC_ENCODER) += nvenc.o nvenc_h264.o
+OBJS-$(CONFIG_NVENC_H264_ENCODER) += nvenc.o nvenc_h264.o
+OBJS-$(CONFIG_H264_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_H264_OMX_ENCODER) += omxenc.o
+OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec.o
+OBJS-$(CONFIG_H264_QSV_ENCODER) += qsvenc_h264.o
+OBJS-$(CONFIG_H264_RKMPP_DECODER) += rkmppdec.o
+OBJS-$(CONFIG_H264_VAAPI_ENCODER) += vaapi_encode_h264.o h264_levels.o
+OBJS-$(CONFIG_H264_VIDEOTOOLBOX_ENCODER) += videotoolboxenc.o
+OBJS-$(CONFIG_H264_V4L2M2M_DECODER) += v4l2_m2m_dec.o
+OBJS-$(CONFIG_H264_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
+OBJS-$(CONFIG_HAP_DECODER) += hapdec.o hap.o
+OBJS-$(CONFIG_HAP_ENCODER) += hapenc.o hap.o
+OBJS-$(CONFIG_HCA_DECODER) += hcadec.o
+OBJS-$(CONFIG_HCOM_DECODER) += hcom.o
+OBJS-$(CONFIG_HEVC_DECODER) += hevcdec.o hevc_mvs.o \
+ hevc_cabac.o hevc_refs.o hevcpred.o \
+ hevcdsp.o hevc_filter.o hevc_data.o
+OBJS-$(CONFIG_HEVC_AMF_ENCODER) += amfenc_hevc.o
+OBJS-$(CONFIG_HEVC_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_HEVC_MEDIACODEC_DECODER) += mediacodecdec.o
+OBJS-$(CONFIG_HEVC_MF_ENCODER) += mfenc.o mf_utils.o
+OBJS-$(CONFIG_HEVC_NVENC_ENCODER) += nvenc.o nvenc_hevc.o
+OBJS-$(CONFIG_NVENC_HEVC_ENCODER) += nvenc.o nvenc_hevc.o
+OBJS-$(CONFIG_HEVC_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_HEVC_QSV_DECODER) += qsvdec.o
+OBJS-$(CONFIG_HEVC_QSV_ENCODER) += qsvenc_hevc.o hevc_ps_enc.o \
+ hevc_data.o
+OBJS-$(CONFIG_HEVC_RKMPP_DECODER) += rkmppdec.o
+OBJS-$(CONFIG_HEVC_VAAPI_ENCODER) += vaapi_encode_h265.o h265_profile_level.o
+OBJS-$(CONFIG_HEVC_V4L2M2M_DECODER) += v4l2_m2m_dec.o
+OBJS-$(CONFIG_HEVC_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
+OBJS-$(CONFIG_HNM4_VIDEO_DECODER) += hnm4video.o
+OBJS-$(CONFIG_HQ_HQA_DECODER) += hq_hqa.o hq_hqadata.o hq_hqadsp.o \
+ canopus.o
+OBJS-$(CONFIG_HQX_DECODER) += hqx.o hqxvlc.o hqxdsp.o canopus.o
+OBJS-$(CONFIG_HUFFYUV_DECODER) += huffyuv.o huffyuvdec.o
+OBJS-$(CONFIG_HUFFYUV_ENCODER) += huffyuv.o huffyuvenc.o
+OBJS-$(CONFIG_HYMT_DECODER) += huffyuv.o huffyuvdec.o
+OBJS-$(CONFIG_IDCIN_DECODER) += idcinvideo.o
+OBJS-$(CONFIG_IDF_DECODER) += bintext.o cga_data.o
+OBJS-$(CONFIG_IFF_ILBM_DECODER) += iff.o
+OBJS-$(CONFIG_ILBC_DECODER) += ilbcdec.o
+OBJS-$(CONFIG_IMC_DECODER) += imc.o
+OBJS-$(CONFIG_IMM4_DECODER) += imm4.o
+OBJS-$(CONFIG_IMM5_DECODER) += imm5.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_IPU_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.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
+OBJS-$(CONFIG_JPEGLS_ENCODER) += jpeglsenc.o jpegls.o
+OBJS-$(CONFIG_JV_DECODER) += jvdec.o
+OBJS-$(CONFIG_KGV1_DECODER) += kgv1dec.o
+OBJS-$(CONFIG_KMVC_DECODER) += kmvc.o
+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_LSCR_DECODER) += lscrdec.o png.o pngdec.o pngdsp.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_MAGICYUV_ENCODER) += magicyuvenc.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 mjpegdec_common.o
+OBJS-$(CONFIG_MJPEG_QSV_DECODER) += qsvdec.o
+OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpegenc_common.o \
+ mjpegenc_huffman.o
+OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o
+OBJS-$(CONFIG_MJPEG_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_MJPEG_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_MJPEG_QSV_ENCODER) += qsvenc_jpeg.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_MOBICLIP_DECODER) += mobiclip.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_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
+OBJS-$(CONFIG_MP3_MF_ENCODER) += mfenc.o mf_utils.o
+OBJS-$(CONFIG_MP3ADU_DECODER) += mpegaudiodec_fixed.o
+OBJS-$(CONFIG_MP3ADUFLOAT_DECODER) += mpegaudiodec_float.o
+OBJS-$(CONFIG_MP3FLOAT_DECODER) += mpegaudiodec_float.o
+OBJS-$(CONFIG_MP3ON4_DECODER) += mpegaudiodec_fixed.o mpeg4audio.o
+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_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_MPEG1_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_MPEG1_V4L2M2M_DECODER) += v4l2_m2m_dec.o
+OBJS-$(CONFIG_MPEG2_MMAL_DECODER) += mmaldec.o
+OBJS-$(CONFIG_MPEG2_QSV_DECODER) += qsvdec.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_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_MPEG2_MEDIACODEC_DECODER) += mediacodecdec.o
+OBJS-$(CONFIG_MPEG2_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_MPEG2_VAAPI_ENCODER) += vaapi_encode_mpeg2.o
+OBJS-$(CONFIG_MPEG2_V4L2M2M_DECODER) += v4l2_m2m_dec.o
+OBJS-$(CONFIG_MPEG4_DECODER) += xvididct.o
+OBJS-$(CONFIG_MPEG4_ENCODER) += mpeg4videoenc.o
+OBJS-$(CONFIG_MPEG4_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec.o
+OBJS-$(CONFIG_MPEG4_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_MPEG4_OMX_ENCODER) += omxenc.o
+OBJS-$(CONFIG_MPEG4_V4L2M2M_DECODER) += v4l2_m2m_dec.o
+OBJS-$(CONFIG_MPEG4_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
+OBJS-$(CONFIG_MPL2_DECODER) += mpl2dec.o ass.o
+OBJS-$(CONFIG_MSA1_DECODER) += mss3.o
+OBJS-$(CONFIG_MSCC_DECODER) += mscc.o
+OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4dec.o msmpeg4.o msmpeg4data.o
+OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4dec.o msmpeg4.o msmpeg4data.o
+OBJS-$(CONFIG_MSMPEG4V2_ENCODER) += msmpeg4enc.o msmpeg4.o msmpeg4data.o
+OBJS-$(CONFIG_MSMPEG4V3_DECODER) += msmpeg4dec.o msmpeg4.o msmpeg4data.o
+OBJS-$(CONFIG_MSMPEG4V3_ENCODER) += msmpeg4enc.o msmpeg4.o msmpeg4data.o
+OBJS-$(CONFIG_MSP2_DECODER) += msp2dec.o
+OBJS-$(CONFIG_MSRLE_DECODER) += msrle.o msrledec.o
+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_MV30_DECODER) += mv30.o
+OBJS-$(CONFIG_MVC1_DECODER) += mvcdec.o
+OBJS-$(CONFIG_MVC2_DECODER) += mvcdec.o
+OBJS-$(CONFIG_MVDV_DECODER) += midivid.o
+OBJS-$(CONFIG_MVHA_DECODER) += mvha.o
+OBJS-$(CONFIG_MWSC_DECODER) += mwsc.o
+OBJS-$(CONFIG_MXPEG_DECODER) += mxpegdec.o
+OBJS-$(CONFIG_NELLYMOSER_DECODER) += nellymoserdec.o nellymoser.o
+OBJS-$(CONFIG_NELLYMOSER_ENCODER) += nellymoserenc.o nellymoser.o
+OBJS-$(CONFIG_NOTCHLC_DECODER) += notchlc.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_rc.o \
+ opus_pvq.o opus_silk.o opustab.o vorbis_data.o \
+ opusdsp.o
+OBJS-$(CONFIG_OPUS_ENCODER) += opusenc.o opus.o opus_rc.o opustab.o opus_pvq.o \
+ opusenc_psy.o vorbis_data.o
+OBJS-$(CONFIG_PAF_AUDIO_DECODER) += pafaudio.o
+OBJS-$(CONFIG_PAF_VIDEO_DECODER) += pafvideo.o
+OBJS-$(CONFIG_PAM_DECODER) += pnmdec.o pnm.o
+OBJS-$(CONFIG_PAM_ENCODER) += pamenc.o
+OBJS-$(CONFIG_PBM_DECODER) += pnmdec.o pnm.o
+OBJS-$(CONFIG_PBM_ENCODER) += pnmenc.o
+OBJS-$(CONFIG_PCX_DECODER) += pcx.o
+OBJS-$(CONFIG_PCX_ENCODER) += pcxenc.o
+OBJS-$(CONFIG_PFM_DECODER) += pnmdec.o pnm.o
+OBJS-$(CONFIG_PFM_ENCODER) += pnmenc.o
+OBJS-$(CONFIG_PGM_DECODER) += pnmdec.o pnm.o
+OBJS-$(CONFIG_PGM_ENCODER) += pnmenc.o
+OBJS-$(CONFIG_PGMYUV_DECODER) += pnmdec.o pnm.o
+OBJS-$(CONFIG_PGMYUV_ENCODER) += pnmenc.o
+OBJS-$(CONFIG_PGSSUB_DECODER) += pgssubdec.o
+OBJS-$(CONFIG_PGX_DECODER) += pgxdec.o
+OBJS-$(CONFIG_PHOTOCD_DECODER) += photocd.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) += proresdec2.o proresdsp.o proresdata.o
+OBJS-$(CONFIG_PRORES_ENCODER) += proresenc_anatoliy.o proresdata.o
+OBJS-$(CONFIG_PRORES_AW_ENCODER) += proresenc_anatoliy.o proresdata.o
+OBJS-$(CONFIG_PRORES_KS_ENCODER) += proresenc_kostya.o proresdata.o
+OBJS-$(CONFIG_PROSUMER_DECODER) += prosumer.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_RASC_DECODER) += rasc.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
+OBJS-$(CONFIG_ROQ_DPCM_DECODER) += dpcm.o
+OBJS-$(CONFIG_ROQ_DPCM_ENCODER) += roqaudioenc.o
+OBJS-$(CONFIG_RPZA_DECODER) += rpza.o
+OBJS-$(CONFIG_RPZA_ENCODER) += rpzaenc.o
+OBJS-$(CONFIG_RSCC_DECODER) += rscc.o
+OBJS-$(CONFIG_RV10_DECODER) += rv10.o
+OBJS-$(CONFIG_RV10_ENCODER) += rv10enc.o
+OBJS-$(CONFIG_RV20_DECODER) += rv10.o
+OBJS-$(CONFIG_RV20_ENCODER) += rv20enc.o
+OBJS-$(CONFIG_RV30_DECODER) += rv30.o rv34.o rv30dsp.o
+OBJS-$(CONFIG_RV30_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_RV40_DECODER) += rv40.o rv34.o rv40dsp.o
+OBJS-$(CONFIG_RV40_OMX_DECODER) += omxdec.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_SGA_DECODER) += sga.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 \
+ acelp_filters.o celp_filters.o \
+ sipr16k.o
+OBJS-$(CONFIG_SIREN_DECODER) += siren.o
+OBJS-$(CONFIG_SIMBIOSIS_IMX_DECODER) += imx.o
+OBJS-$(CONFIG_SMACKAUD_DECODER) += smacker.o
+OBJS-$(CONFIG_SMACKER_DECODER) += smacker.o
+OBJS-$(CONFIG_SMC_DECODER) += smc.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 h263data.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 mpeg12.o mpeg12data.o simple_idct.o
+OBJS-$(CONFIG_SPEEDHQ_ENCODER) += speedhq.o mpeg12data.o mpeg12enc.o speedhqenc.o
+OBJS-$(CONFIG_SP5X_DECODER) += sp5xdec.o
+OBJS-$(CONFIG_SRGC_DECODER) += mscc.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_LIBRSVG_DECODER) += librsvgdec.o
+OBJS-$(CONFIG_SBC_DECODER) += sbcdec.o sbcdec_data.o sbc.o
+OBJS-$(CONFIG_SBC_ENCODER) += sbcenc.o sbc.o sbcdsp.o sbcdsp_data.o
+OBJS-$(CONFIG_SORENSON_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_SVQ1_DECODER) += svq1dec.o svq1.o h263data.o
+OBJS-$(CONFIG_SVQ1_ENCODER) += svq1enc.o svq1.o h263data.o \
+ h263.o ituh263enc.o
+OBJS-$(CONFIG_SVQ3_DECODER) += svq3.o mpegutils.o h264data.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 tiff_common.o
+OBJS-$(CONFIG_TIFF_ENCODER) += tiffenc.o rle.o lzwenc.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 ttadata.o ttadsp.o
+OBJS-$(CONFIG_TTA_ENCODER) += ttaenc.o ttaencdsp.o ttadata.o
+OBJS-$(CONFIG_TTML_ENCODER) += ttmlenc.o ass_split.o
+OBJS-$(CONFIG_TWINVQ_DECODER) += twinvqdec.o twinvq.o metasound_data.o
+OBJS-$(CONFIG_TXD_DECODER) += txd.o
+OBJS-$(CONFIG_ULTI_DECODER) += ulti.o
+OBJS-$(CONFIG_UTVIDEO_DECODER) += utvideodec.o utvideodsp.o
+OBJS-$(CONFIG_UTVIDEO_ENCODER) += utvideoenc.o
+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
+OBJS-$(CONFIG_VBLE_DECODER) += vble.o
+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 \
+ wmv2dsp.o wmv2data.o
+OBJS-$(CONFIG_VC1_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_VC1_MMAL_DECODER) += mmaldec.o
+OBJS-$(CONFIG_VC1_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_VC1_QSV_DECODER) += qsvdec.o
+OBJS-$(CONFIG_VC1_V4L2M2M_DECODER) += v4l2_m2m_dec.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
+OBJS-$(CONFIG_VMNC_DECODER) += vmnc.o
+OBJS-$(CONFIG_VORBIS_DECODER) += vorbisdec.o vorbisdsp.o vorbis.o \
+ vorbis_data.o
+OBJS-$(CONFIG_VORBIS_ENCODER) += vorbisenc.o vorbis.o \
+ vorbis_data.o
+OBJS-$(CONFIG_VP3_DECODER) += vp3.o
+OBJS-$(CONFIG_VP5_DECODER) += vp5.o vp56.o vp56data.o vp56rac.o
+OBJS-$(CONFIG_VP6_DECODER) += vp6.o vp56.o vp56data.o \
+ vp6dsp.o vp56rac.o
+OBJS-$(CONFIG_VP6_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_VP7_DECODER) += vp8.o vp56rac.o
+OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp56rac.o
+OBJS-$(CONFIG_VP8_CUVID_DECODER) += cuviddec.o
+OBJS-$(CONFIG_VP8_MEDIACODEC_DECODER) += mediacodecdec.o
+OBJS-$(CONFIG_VP8_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_VP8_QSV_DECODER) += qsvdec.o
+OBJS-$(CONFIG_VP8_RKMPP_DECODER) += rkmppdec.o
+OBJS-$(CONFIG_VP8_VAAPI_ENCODER) += vaapi_encode_vp8.o
+OBJS-$(CONFIG_VP8_V4L2M2M_DECODER) += v4l2_m2m_dec.o
+OBJS-$(CONFIG_VP8_V4L2M2M_ENCODER) += v4l2_m2m_enc.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) += cuviddec.o
+OBJS-$(CONFIG_VP9_MEDIACODEC_DECODER) += mediacodecdec.o
+OBJS-$(CONFIG_VP9_RKMPP_DECODER) += rkmppdec.o
+OBJS-$(CONFIG_VP9_VAAPI_ENCODER) += vaapi_encode_vp9.o
+OBJS-$(CONFIG_VP9_QSV_ENCODER) += qsvenc_vp9.o
+OBJS-$(CONFIG_VPLAYER_DECODER) += textdec.o ass.o
+OBJS-$(CONFIG_VP9_V4L2M2M_DECODER) += v4l2_m2m_dec.o
+OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o
+OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o wavpackdata.o dsd.o
+OBJS-$(CONFIG_WAVPACK_ENCODER) += wavpackdata.o wavpackenc.o
+OBJS-$(CONFIG_WCMV_DECODER) += wcmv.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
+OBJS-$(CONFIG_WMAV1_ENCODER) += wmaenc.o wma.o wma_common.o aactab.o
+OBJS-$(CONFIG_WMAV2_DECODER) += wmadec.o wma.o wma_common.o aactab.o
+OBJS-$(CONFIG_WMAV2_ENCODER) += wmaenc.o wma.o wma_common.o aactab.o
+OBJS-$(CONFIG_WMAVOICE_DECODER) += wmavoice.o \
+ 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 msmpeg4.o msmpeg4data.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 \
+ msmpeg4.o msmpeg4enc.o msmpeg4data.o
+OBJS-$(CONFIG_WMV3_OMX_DECODER) += omxdec.o
+OBJS-$(CONFIG_WNV1_DECODER) += wnv1.o
+OBJS-$(CONFIG_WRAPPED_AVFRAME_DECODER) += wrapped_avframe.o
+OBJS-$(CONFIG_WRAPPED_AVFRAME_ENCODER) += wrapped_avframe.o
+OBJS-$(CONFIG_WS_SND1_DECODER) += ws-snd1.o
+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
+OBJS-$(CONFIG_ZMBV_DECODER) += zmbv.o
+OBJS-$(CONFIG_ZMBV_ENCODER) += zmbvenc.o
+
+# (AD)PCM decoders/encoders
+OBJS-$(CONFIG_PCM_ALAW_DECODER) += pcm.o
+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_DVD_ENCODER) += pcm-dvdenc.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
+OBJS-$(CONFIG_PCM_F32LE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_F64BE_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_F64BE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_F64LE_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_F64LE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_LXF_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_MULAW_DECODER) += pcm.o
+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) += 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
+OBJS-$(CONFIG_PCM_S24DAUD_ENCODER) += pcm.o
+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_SGA_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_U8_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_U8_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_U16BE_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_U16BE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_U16LE_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_U16LE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_U24BE_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_U24BE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_U24LE_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_U24LE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_U32BE_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_U32BE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_VIDC_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_VIDC_ENCODER) += pcm.o
+
+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_AGM_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_AICA_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_ARGO_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_ARGO_ENCODER) += adpcm.o adpcmenc.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
+OBJS-$(CONFIG_ADPCM_EA_R2_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_EA_R3_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_EA_XAS_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_G722_DECODER) += g722.o g722dsp.o g722dec.o
+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_G726LE_ENCODER) += g726.o
+OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_AMV_ENCODER) += adpcmenc.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_ALP_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_ALP_ENCODER) += adpcmenc.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_APM_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_APM_ENCODER) += adpcmenc.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_CUNNING_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_MOFLEX_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_MTF_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_SSI_DECODER) += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_SSI_ENCODER) += adpcmenc.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
+OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_ZORK_DECODER) += adpcm.o adpcm_data.o
+
+# hardware accelerators
+OBJS-$(CONFIG_D3D11VA) += dxva2.o
+OBJS-$(CONFIG_DXVA2) += dxva2.o
+OBJS-$(CONFIG_NVDEC) += nvdec.o
+OBJS-$(CONFIG_VAAPI) += vaapi_decode.o
+OBJS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.o
+OBJS-$(CONFIG_VDPAU) += vdpau.o
+
+OBJS-$(CONFIG_AV1_D3D11VA_HWACCEL) += dxva2_av1.o
+OBJS-$(CONFIG_AV1_DXVA2_HWACCEL) += dxva2_av1.o
+OBJS-$(CONFIG_AV1_NVDEC_HWACCEL) += nvdec_av1.o
+OBJS-$(CONFIG_AV1_VAAPI_HWACCEL) += vaapi_av1.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_NVDEC_HWACCEL) += nvdec_h264.o
+OBJS-$(CONFIG_H264_QSV_HWACCEL) += qsvdec.o
+OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_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_NVDEC_HWACCEL) += nvdec_hevc.o
+OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o
+OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o
+OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o
+OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o
+OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL) += vaapi_mjpeg.o
+OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL) += nvdec_mpeg12.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_NVDEC_HWACCEL) += nvdec_mpeg12.o
+OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec.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_NVDEC_HWACCEL) += nvdec_mpeg4.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_NVDEC_HWACCEL) += nvdec_vc1.o
+OBJS-$(CONFIG_VC1_QSV_HWACCEL) += qsvdec.o
+OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o
+OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o
+OBJS-$(CONFIG_VP8_NVDEC_HWACCEL) += nvdec_vp8.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_NVDEC_HWACCEL) += nvdec_vp9.o
+OBJS-$(CONFIG_VP9_VAAPI_HWACCEL) += vaapi_vp9.o
+OBJS-$(CONFIG_VP9_VDPAU_HWACCEL) += vdpau_vp9.o
+OBJS-$(CONFIG_VP8_QSV_HWACCEL) += qsvdec.o
+
+# libavformat dependencies
+OBJS-$(CONFIG_ISO_MEDIA) += mpeg4audio.o mpegaudiodata.o
+
+OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o
+OBJS-$(CONFIG_CODEC2_DEMUXER) += codec2utils.o
+OBJS-$(CONFIG_CODEC2_MUXER) += codec2utils.o
+OBJS-$(CONFIG_CODEC2RAW_DEMUXER) += codec2utils.o
+OBJS-$(CONFIG_DNXHD_DEMUXER) += dnxhddata.o
+OBJS-$(CONFIG_FITS_DEMUXER) += fits.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_MATROSKA_DEMUXER) += mpeg4audio.o
+OBJS-$(CONFIG_MXF_MUXER) += dnxhddata.o
+OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o
+OBJS-$(CONFIG_RTP_MUXER) += 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_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
+OBJS-$(CONFIG_MP2_AT_DECODER) += audiotoolboxdec.o
+OBJS-$(CONFIG_MP3_AT_DECODER) += audiotoolboxdec.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_LIBAOM_AV1_DECODER) += libaomdec.o
+OBJS-$(CONFIG_LIBAOM_AV1_ENCODER) += libaomenc.o
+OBJS-$(CONFIG_LIBARIBB24_DECODER) += libaribb24.o ass.o
+OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o
+OBJS-$(CONFIG_LIBCODEC2_DECODER) += libcodec2.o codec2utils.o
+OBJS-$(CONFIG_LIBCODEC2_ENCODER) += libcodec2.o codec2utils.o
+OBJS-$(CONFIG_LIBDAV1D_DECODER) += libdav1d.o
+OBJS-$(CONFIG_LIBDAVS2_DECODER) += libdavs2.o
+OBJS-$(CONFIG_LIBFDK_AAC_DECODER) += libfdk-aacdec.o
+OBJS-$(CONFIG_LIBFDK_AAC_ENCODER) += libfdk-aacenc.o
+OBJS-$(CONFIG_LIBGSM_DECODER) += libgsmdec.o
+OBJS-$(CONFIG_LIBGSM_ENCODER) += libgsmenc.o
+OBJS-$(CONFIG_LIBGSM_MS_DECODER) += libgsmdec.o
+OBJS-$(CONFIG_LIBGSM_MS_ENCODER) += libgsmenc.o
+OBJS-$(CONFIG_LIBILBC_DECODER) += libilbc.o
+OBJS-$(CONFIG_LIBILBC_ENCODER) += libilbc.o
+OBJS-$(CONFIG_LIBKVAZAAR_ENCODER) += libkvazaar.o
+OBJS-$(CONFIG_LIBMP3LAME_ENCODER) += libmp3lame.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
+OBJS-$(CONFIG_LIBOPENH264_DECODER) += libopenh264dec.o libopenh264.o
+OBJS-$(CONFIG_LIBOPENH264_ENCODER) += libopenh264enc.o libopenh264.o
+OBJS-$(CONFIG_LIBOPENJPEG_DECODER) += libopenjpegdec.o
+OBJS-$(CONFIG_LIBOPENJPEG_ENCODER) += libopenjpegenc.o
+OBJS-$(CONFIG_LIBOPUS_DECODER) += libopusdec.o libopus.o \
+ vorbis_data.o
+OBJS-$(CONFIG_LIBOPUS_ENCODER) += libopusenc.o libopus.o \
+ vorbis_data.o
+OBJS-$(CONFIG_LIBRAV1E_ENCODER) += librav1e.o
+OBJS-$(CONFIG_LIBSHINE_ENCODER) += libshine.o
+OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o
+OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o
+OBJS-$(CONFIG_LIBSVTAV1_ENCODER) += libsvtav1.o
+OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o
+OBJS-$(CONFIG_LIBTWOLAME_ENCODER) += libtwolame.o
+OBJS-$(CONFIG_LIBUAVS3D_DECODER) += libuavs3d.o
+OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o
+OBJS-$(CONFIG_LIBVORBIS_DECODER) += libvorbisdec.o
+OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbisenc.o \
+ vorbis_data.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_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_LIBXAVS2_ENCODER) += libxavs2.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
+OBJS-$(CONFIG_AAC_PARSER) += aac_parser.o aac_ac3_parser.o \
+ mpeg4audio.o
+OBJS-$(CONFIG_AC3_PARSER) += ac3tab.o aac_ac3_parser.o
+OBJS-$(CONFIG_ADX_PARSER) += adx_parser.o adx.o
+OBJS-$(CONFIG_AV1_PARSER) += av1_parser.o av1_parse.o
+OBJS-$(CONFIG_AVS2_PARSER) += avs2_parser.o
+OBJS-$(CONFIG_AVS3_PARSER) += avs3_parser.o
+OBJS-$(CONFIG_BMP_PARSER) += bmp_parser.o
+OBJS-$(CONFIG_CAVSVIDEO_PARSER) += cavs_parser.o
+OBJS-$(CONFIG_COOK_PARSER) += cook_parser.o
+OBJS-$(CONFIG_CRI_PARSER) += cri_parser.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 dnxhddata.o
+OBJS-$(CONFIG_DOLBY_E_PARSER) += dolby_e_parser.o dolby_e_parse.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_G723_1_PARSER) += g723_1_parser.o
+OBJS-$(CONFIG_G729_PARSER) += g729_parser.o
+OBJS-$(CONFIG_GIF_PARSER) += gif_parser.o
+OBJS-$(CONFIG_GSM_PARSER) += gsm_parser.o
+OBJS-$(CONFIG_H261_PARSER) += h261_parser.o
+OBJS-$(CONFIG_H263_PARSER) += h263_parser.o
+OBJS-$(CONFIG_H264_PARSER) += h264_parser.o h264_sei.o h264data.o
+OBJS-$(CONFIG_HEVC_PARSER) += hevc_parser.o hevc_data.o
+OBJS-$(CONFIG_IPU_PARSER) += ipu_parser.o
+OBJS-$(CONFIG_JPEG2000_PARSER) += jpeg2000_parser.o
+OBJS-$(CONFIG_MJPEG_PARSER) += mjpeg_parser.o
+OBJS-$(CONFIG_MLP_PARSER) += mlp_parse.o mlp_parser.o mlp.o
+OBJS-$(CONFIG_MPEG4VIDEO_PARSER) += mpeg4video_parser.o h263.o \
+ mpeg4videodec.o mpeg4video.o \
+ ituh263dec.o h263dec.o h263data.o
+OBJS-$(CONFIG_MPEGAUDIO_PARSER) += mpegaudio_parser.o
+OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \
+ mpeg12.o mpeg12data.o
+OBJS-$(CONFIG_OPUS_PARSER) += opus_parser.o opus.o opustab.o \
+ opus_rc.o vorbis_data.o
+OBJS-$(CONFIG_PNG_PARSER) += png_parser.o
+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_SBC_PARSER) += sbc_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_WEBP_PARSER) += webp_parser.o
+OBJS-$(CONFIG_XBM_PARSER) += xbm_parser.o
+OBJS-$(CONFIG_XMA_PARSER) += xma_parser.o
+
+# bitstream filters
+OBJS-$(CONFIG_AAC_ADTSTOASC_BSF) += aac_adtstoasc_bsf.o mpeg4audio.o
+OBJS-$(CONFIG_AV1_METADATA_BSF) += av1_metadata_bsf.o
+OBJS-$(CONFIG_AV1_FRAME_MERGE_BSF) += av1_frame_merge_bsf.o
+OBJS-$(CONFIG_AV1_FRAME_SPLIT_BSF) += av1_frame_split_bsf.o
+OBJS-$(CONFIG_CHOMP_BSF) += chomp_bsf.o
+OBJS-$(CONFIG_DUMP_EXTRADATA_BSF) += dump_extradata_bsf.o
+OBJS-$(CONFIG_DCA_CORE_BSF) += dca_core_bsf.o
+OBJS-$(CONFIG_EAC3_CORE_BSF) += eac3_core_bsf.o
+OBJS-$(CONFIG_EXTRACT_EXTRADATA_BSF) += extract_extradata_bsf.o \
+ av1_parse.o h2645_parse.o
+OBJS-$(CONFIG_FILTER_UNITS_BSF) += filter_units_bsf.o
+OBJS-$(CONFIG_H264_METADATA_BSF) += h264_metadata_bsf.o h264_levels.o
+OBJS-$(CONFIG_H264_MP4TOANNEXB_BSF) += h264_mp4toannexb_bsf.o
+OBJS-$(CONFIG_H264_REDUNDANT_PPS_BSF) += h264_redundant_pps_bsf.o
+OBJS-$(CONFIG_HAPQA_EXTRACT_BSF) += hapqa_extract_bsf.o hap.o
+OBJS-$(CONFIG_HEVC_METADATA_BSF) += h265_metadata_bsf.o h265_profile_level.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_MPEG2_METADATA_BSF) += mpeg2_metadata_bsf.o
+OBJS-$(CONFIG_NOISE_BSF) += noise_bsf.o
+OBJS-$(CONFIG_NULL_BSF) += null_bsf.o
+OBJS-$(CONFIG_OPUS_METADATA_BSF) += opus_metadata_bsf.o
+OBJS-$(CONFIG_PCM_RECHUNK_BSF) += pcm_rechunk_bsf.o
+OBJS-$(CONFIG_PRORES_METADATA_BSF) += prores_metadata_bsf.o
+OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF) += remove_extradata_bsf.o
+OBJS-$(CONFIG_SETTS_BSF) += setts_bsf.o
+OBJS-$(CONFIG_TEXT2MOVSUB_BSF) += movsub_bsf.o
+OBJS-$(CONFIG_TRACE_HEADERS_BSF) += trace_headers_bsf.o
+OBJS-$(CONFIG_TRUEHD_CORE_BSF) += truehd_core_bsf.o mlp_parse.o mlp.o
+OBJS-$(CONFIG_VP9_METADATA_BSF) += vp9_metadata_bsf.o
+OBJS-$(CONFIG_VP9_RAW_REORDER_BSF) += vp9_raw_reorder_bsf.o
+OBJS-$(CONFIG_VP9_SUPERFRAME_BSF) += vp9_superframe_bsf.o
+OBJS-$(CONFIG_VP9_SUPERFRAME_SPLIT_BSF) += vp9_superframe_split_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 \
+ 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_AMF) += amfenc.h
+SKIPHEADERS-$(CONFIG_D3D11VA) += d3d11va.h dxva2_internal.h
+SKIPHEADERS-$(CONFIG_DXVA2) += dxva2.h dxva2_internal.h
+SKIPHEADERS-$(CONFIG_JNI) += ffjni.h
+SKIPHEADERS-$(CONFIG_LIBVPX) += libvpx.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_MEDIAFOUNDATION) += mf_utils.h
+SKIPHEADERS-$(CONFIG_NVDEC) += nvdec.h
+SKIPHEADERS-$(CONFIG_NVENC) += nvenc.h
+SKIPHEADERS-$(CONFIG_QSV) += qsv.h qsv_internal.h
+SKIPHEADERS-$(CONFIG_QSVENC) += qsvenc.h
+SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h
+SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_decode.h vaapi_hevc.h vaapi_encode.h
+SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h
+SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.h vt_internal.h
+SKIPHEADERS-$(CONFIG_V4L2_M2M) += v4l2_buffers.h v4l2_context.h v4l2_m2m.h
+
+TESTPROGS = avpacket \
+ celp_math \
+ codec_desc \
+ htmlsubtitles \
+ imgconvert \
+ jpeg2000dwt \
+ mathops \
+ utils \
+
+TESTPROGS-$(CONFIG_CABAC) += cabac
+TESTPROGS-$(CONFIG_DCT) += avfft
+TESTPROGS-$(CONFIG_FFT) += fft fft-fixed32
+TESTPROGS-$(CONFIG_GOLOMB) += golomb
+TESTPROGS-$(CONFIG_IDCTDSP) += dct
+TESTPROGS-$(CONFIG_IIRFILTER) += iirfilter
+TESTPROGS-$(CONFIG_MJPEG_ENCODER) += mjpegenc_huffman
+TESTPROGS-$(HAVE_MMX) += motion
+TESTPROGS-$(CONFIG_MPEGVIDEO) += mpeg12framerate
+TESTPROGS-$(CONFIG_H264_METADATA_BSF) += h264_levels
+TESTPROGS-$(CONFIG_HEVC_METADATA_BSF) += h265_levels
+TESTPROGS-$(CONFIG_RANGECODER) += rangecoder
+TESTPROGS-$(CONFIG_SNOW_ENCODER) += snowenc
+
+TESTOBJS = dctref.o
+
+TOOLS = fourcc2pixfmt
+
+HOSTPROGS = aacps_tablegen \
+ aacps_fixed_tablegen \
+ cbrt_tablegen \
+ cbrt_fixed_tablegen \
+ cos_tablegen \
+ dv_tablegen \
+ motionpixels_tablegen \
+ mpegaudio_tablegen \
+ mpegaudiodec_common_tablegen \
+ pcm_tablegen \
+ qdm2_tablegen \
+ sinewin_tablegen \
+ sinewin_fixed_tablegen \
+
+CLEANFILES = *_tables.c *_tables.h *_tablegen$(HOSTEXESUF)
+
+$(SUBDIR)tests/dct$(EXESUF): $(SUBDIR)dctref.o $(SUBDIR)aandcttab.o
+$(SUBDIR)dv_tablegen$(HOSTEXESUF): $(SUBDIR)dvdata_host.o
+
+TRIG_TABLES = cos cos_fixed sin
+TRIG_TABLES := $(TRIG_TABLES:%=$(SUBDIR)%_tables.c)
+
+$(TRIG_TABLES): $(SUBDIR)%_tables.c: $(SUBDIR)cos_tablegen$(HOSTEXESUF)
+ $(M)./$< $* > $@
+
+ifdef CONFIG_SMALL
+$(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=1
+else
+$(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0
+endif
+
+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 \
+ mpegaudiodec_common_tables.h motionpixels_tables.h \
+ pcm_tables.h qdm2_tables.h
+GEN_HEADERS := $(addprefix $(SUBDIR), $(GEN_HEADERS))
+
+$(GEN_HEADERS): $(SUBDIR)%_tables.h: $(SUBDIR)%_tablegen$(HOSTEXESUF)
+ $(M)./$< > $@
+
+ifdef CONFIG_HARDCODED_TABLES
+$(SUBDIR)cbrt_data.o: $(SUBDIR)cbrt_tables.h
+$(SUBDIR)cbrt_data_fixed.o: $(SUBDIR)cbrt_fixed_tables.h
+$(SUBDIR)aacdec_fixed.o: $(SUBDIR)sinewin_fixed_tables.h
+$(SUBDIR)aacps_float.o: $(SUBDIR)aacps_tables.h
+$(SUBDIR)aacps_fixed.o: $(SUBDIR)aacps_fixed_tables.h
+$(SUBDIR)dvenc.o: $(SUBDIR)dv_tables.h
+$(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h
+$(SUBDIR)mpegaudiodec_common.o: $(SUBDIR)mpegaudiodec_common_tables.h
+$(SUBDIR)mpegaudiodec_fixed.o: $(SUBDIR)mpegaudio_tables.h
+$(SUBDIR)mpegaudiodec_float.o: $(SUBDIR)mpegaudio_tables.h
+$(SUBDIR)pcm.o: $(SUBDIR)pcm_tables.h
+$(SUBDIR)qdm2.o: $(SUBDIR)qdm2_tables.h
+$(SUBDIR)sinewin.o: $(SUBDIR)sinewin_tables.h
+endif
Index: allcodecs.c
===================================================================
--- allcodecs.c (nonexistent)
+++ allcodecs.c (revision 377)
@@ -0,0 +1,993 @@
+/*
+ * Provide registration of all codecs, parsers and bitstream filters for libavcodec.
+ * Copyright (c) 2002 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Provide registration of all codecs, parsers and bitstream filters for libavcodec.
+ */
+
+#include "config.h"
+#include "libavutil/thread.h"
+#include "avcodec.h"
+#include "version.h"
+
+extern AVCodec ff_a64multi_encoder;
+extern AVCodec ff_a64multi5_encoder;
+extern AVCodec ff_aasc_decoder;
+extern AVCodec ff_aic_decoder;
+extern AVCodec ff_alias_pix_encoder;
+extern AVCodec ff_alias_pix_decoder;
+extern AVCodec ff_agm_decoder;
+extern AVCodec ff_amv_encoder;
+extern AVCodec ff_amv_decoder;
+extern AVCodec ff_anm_decoder;
+extern AVCodec ff_ansi_decoder;
+extern AVCodec ff_apng_encoder;
+extern AVCodec ff_apng_decoder;
+extern AVCodec ff_arbc_decoder;
+extern AVCodec ff_argo_decoder;
+extern AVCodec ff_asv1_encoder;
+extern AVCodec ff_asv1_decoder;
+extern AVCodec ff_asv2_encoder;
+extern AVCodec ff_asv2_decoder;
+extern AVCodec ff_aura_decoder;
+extern AVCodec ff_aura2_decoder;
+extern AVCodec ff_avrp_encoder;
+extern AVCodec ff_avrp_decoder;
+extern AVCodec ff_avrn_decoder;
+extern AVCodec ff_avs_omx_decoder;
+extern AVCodec ff_avs_decoder;
+extern AVCodec ff_avui_encoder;
+extern AVCodec ff_avui_decoder;
+extern AVCodec ff_ayuv_encoder;
+extern AVCodec ff_ayuv_decoder;
+extern AVCodec ff_bethsoftvid_decoder;
+extern AVCodec ff_bfi_decoder;
+extern AVCodec ff_bink_decoder;
+extern AVCodec ff_bitpacked_decoder;
+extern AVCodec ff_bmp_encoder;
+extern AVCodec ff_bmp_decoder;
+extern AVCodec ff_bmv_video_decoder;
+extern AVCodec ff_brender_pix_decoder;
+extern AVCodec ff_c93_decoder;
+extern AVCodec ff_cavs_decoder;
+extern AVCodec ff_cdgraphics_decoder;
+extern AVCodec ff_cdtoons_decoder;
+extern AVCodec ff_cdxl_decoder;
+extern AVCodec ff_cfhd_encoder;
+extern AVCodec ff_cfhd_decoder;
+extern AVCodec ff_cinepak_encoder;
+extern AVCodec ff_cinepak_decoder;
+extern AVCodec ff_clearvideo_decoder;
+extern AVCodec ff_cljr_encoder;
+extern AVCodec ff_cljr_decoder;
+extern AVCodec ff_cllc_decoder;
+extern AVCodec ff_comfortnoise_encoder;
+extern AVCodec ff_comfortnoise_decoder;
+extern AVCodec ff_cpia_decoder;
+extern AVCodec ff_cri_decoder;
+extern AVCodec ff_cscd_decoder;
+extern AVCodec ff_cyuv_decoder;
+extern AVCodec ff_dds_decoder;
+extern AVCodec ff_dfa_decoder;
+extern AVCodec ff_dirac_decoder;
+extern AVCodec ff_dnxhd_encoder;
+extern AVCodec ff_dnxhd_decoder;
+extern AVCodec ff_dpx_encoder;
+extern AVCodec ff_dpx_decoder;
+extern AVCodec ff_dsicinvideo_decoder;
+extern AVCodec ff_dvaudio_decoder;
+extern AVCodec ff_dvvideo_encoder;
+extern AVCodec ff_dvvideo_decoder;
+extern AVCodec ff_dxa_decoder;
+extern AVCodec ff_dxtory_decoder;
+extern AVCodec ff_dxv_decoder;
+extern AVCodec ff_eacmv_decoder;
+extern AVCodec ff_eamad_decoder;
+extern AVCodec ff_eatgq_decoder;
+extern AVCodec ff_eatgv_decoder;
+extern AVCodec ff_eatqi_decoder;
+extern AVCodec ff_eightbps_decoder;
+extern AVCodec ff_eightsvx_exp_decoder;
+extern AVCodec ff_eightsvx_fib_decoder;
+extern AVCodec ff_escape124_decoder;
+extern AVCodec ff_escape130_decoder;
+extern AVCodec ff_exr_encoder;
+extern AVCodec ff_exr_decoder;
+extern AVCodec ff_ffv1_encoder;
+extern AVCodec ff_ffv1_decoder;
+extern AVCodec ff_ffvhuff_encoder;
+extern AVCodec ff_ffvhuff_decoder;
+extern AVCodec ff_fic_decoder;
+extern AVCodec ff_fits_encoder;
+extern AVCodec ff_fits_decoder;
+extern AVCodec ff_flashsv_encoder;
+extern AVCodec ff_flashsv_decoder;
+extern AVCodec ff_flashsv2_encoder;
+extern AVCodec ff_flashsv2_decoder;
+extern AVCodec ff_flic_decoder;
+extern AVCodec ff_flv_encoder;
+extern AVCodec ff_sorenson_omx_decoder;
+extern AVCodec ff_flv_decoder;
+extern AVCodec ff_fmvc_decoder;
+extern AVCodec ff_fourxm_decoder;
+extern AVCodec ff_fraps_decoder;
+extern AVCodec ff_frwu_decoder;
+extern AVCodec ff_g2m_decoder;
+extern AVCodec ff_gdv_decoder;
+extern AVCodec ff_gif_encoder;
+extern AVCodec ff_gif_decoder;
+extern AVCodec ff_h261_encoder;
+extern AVCodec ff_h261_decoder;
+extern AVCodec ff_h263_encoder;
+extern AVCodec ff_h263_omx_decoder;
+extern AVCodec ff_h263_decoder;
+extern AVCodec ff_h263i_decoder;
+extern AVCodec ff_h263p_encoder;
+extern AVCodec ff_h263p_decoder;
+extern AVCodec ff_h263_v4l2m2m_decoder;
+extern AVCodec ff_h264_omx_decoder;
+extern AVCodec ff_h264_decoder;
+extern AVCodec ff_h264_crystalhd_decoder;
+extern AVCodec ff_h264_v4l2m2m_decoder;
+extern AVCodec ff_h264_mediacodec_decoder;
+extern AVCodec ff_h264_mmal_decoder;
+extern AVCodec ff_h264_qsv_decoder;
+extern AVCodec ff_h264_rkmpp_decoder;
+extern AVCodec ff_hap_encoder;
+extern AVCodec ff_hap_decoder;
+extern AVCodec ff_hevc_omx_decoder;
+extern AVCodec ff_hevc_decoder;
+extern AVCodec ff_hevc_qsv_decoder;
+extern AVCodec ff_hevc_rkmpp_decoder;
+extern AVCodec ff_hevc_v4l2m2m_decoder;
+extern AVCodec ff_hnm4_video_decoder;
+extern AVCodec ff_hq_hqa_decoder;
+extern AVCodec ff_hqx_decoder;
+extern AVCodec ff_huffyuv_encoder;
+extern AVCodec ff_huffyuv_decoder;
+extern AVCodec ff_hymt_decoder;
+extern AVCodec ff_idcin_decoder;
+extern AVCodec ff_iff_ilbm_decoder;
+extern AVCodec ff_imm4_decoder;
+extern AVCodec ff_imm5_decoder;
+extern AVCodec ff_indeo2_decoder;
+extern AVCodec ff_indeo3_decoder;
+extern AVCodec ff_indeo4_decoder;
+extern AVCodec ff_indeo5_decoder;
+extern AVCodec ff_interplay_video_decoder;
+extern AVCodec ff_ipu_decoder;
+extern AVCodec ff_jpeg2000_encoder;
+extern AVCodec ff_jpeg2000_decoder;
+extern AVCodec ff_jpegls_encoder;
+extern AVCodec ff_jpegls_decoder;
+extern AVCodec ff_jv_decoder;
+extern AVCodec ff_kgv1_decoder;
+extern AVCodec ff_kmvc_decoder;
+extern AVCodec ff_lagarith_decoder;
+extern AVCodec ff_ljpeg_encoder;
+extern AVCodec ff_loco_decoder;
+extern AVCodec ff_lscr_decoder;
+extern AVCodec ff_m101_decoder;
+extern AVCodec ff_magicyuv_encoder;
+extern AVCodec ff_magicyuv_decoder;
+extern AVCodec ff_mdec_decoder;
+extern AVCodec ff_mimic_decoder;
+extern AVCodec ff_mjpeg_encoder;
+extern AVCodec ff_mjpeg_decoder;
+extern AVCodec ff_mjpeg_omx_decoder;
+extern AVCodec ff_mjpegb_decoder;
+extern AVCodec ff_mmvideo_decoder;
+extern AVCodec ff_mobiclip_decoder;
+extern AVCodec ff_motionpixels_decoder;
+extern AVCodec ff_mpeg1video_encoder;
+extern AVCodec ff_mpeg1video_decoder;
+extern AVCodec ff_mpeg2video_encoder;
+extern AVCodec ff_mpeg2video_decoder;
+extern AVCodec ff_mpeg2_omx_decoder;
+extern AVCodec ff_mpeg4_encoder;
+extern AVCodec ff_mpeg4_decoder;
+extern AVCodec ff_mpeg4_omx_decoder;
+extern AVCodec ff_mpeg4_crystalhd_decoder;
+extern AVCodec ff_mpeg4_v4l2m2m_decoder;
+extern AVCodec ff_mpeg4_mmal_decoder;
+extern AVCodec ff_mpegvideo_decoder;
+extern AVCodec ff_mpeg1_v4l2m2m_decoder;
+extern AVCodec ff_mpeg2_mmal_decoder;
+extern AVCodec ff_mpeg2_crystalhd_decoder;
+extern AVCodec ff_mpeg2_v4l2m2m_decoder;
+extern AVCodec ff_mpeg2_qsv_decoder;
+extern AVCodec ff_mpeg2_mediacodec_decoder;
+extern AVCodec ff_msa1_decoder;
+extern AVCodec ff_mscc_decoder;
+extern AVCodec ff_msmpeg4v1_decoder;
+extern AVCodec ff_msmpeg4v2_encoder;
+extern AVCodec ff_msmpeg4v2_decoder;
+extern AVCodec ff_msmpeg4v3_encoder;
+extern AVCodec ff_msmpeg4v3_decoder;
+extern AVCodec ff_msmpeg4_crystalhd_decoder;
+extern AVCodec ff_msp2_decoder;
+extern AVCodec ff_msrle_decoder;
+extern AVCodec ff_mss1_decoder;
+extern AVCodec ff_mss2_decoder;
+extern AVCodec ff_msvideo1_encoder;
+extern AVCodec ff_msvideo1_decoder;
+extern AVCodec ff_mszh_decoder;
+extern AVCodec ff_mts2_decoder;
+extern AVCodec ff_mv30_decoder;
+extern AVCodec ff_mvc1_decoder;
+extern AVCodec ff_mvc2_decoder;
+extern AVCodec ff_mvdv_decoder;
+extern AVCodec ff_mvha_decoder;
+extern AVCodec ff_mwsc_decoder;
+extern AVCodec ff_mxpeg_decoder;
+extern AVCodec ff_notchlc_decoder;
+extern AVCodec ff_nuv_decoder;
+extern AVCodec ff_paf_video_decoder;
+extern AVCodec ff_pam_encoder;
+extern AVCodec ff_pam_decoder;
+extern AVCodec ff_pbm_encoder;
+extern AVCodec ff_pbm_decoder;
+extern AVCodec ff_pcx_encoder;
+extern AVCodec ff_pcx_decoder;
+extern AVCodec ff_pfm_encoder;
+extern AVCodec ff_pfm_decoder;
+extern AVCodec ff_pgm_encoder;
+extern AVCodec ff_pgm_decoder;
+extern AVCodec ff_pgmyuv_encoder;
+extern AVCodec ff_pgmyuv_decoder;
+extern AVCodec ff_pgx_decoder;
+extern AVCodec ff_photocd_decoder;
+extern AVCodec ff_pictor_decoder;
+extern AVCodec ff_pixlet_decoder;
+extern AVCodec ff_png_encoder;
+extern AVCodec ff_png_decoder;
+extern AVCodec ff_ppm_encoder;
+extern AVCodec ff_ppm_decoder;
+extern AVCodec ff_prores_encoder;
+extern AVCodec ff_prores_decoder;
+extern AVCodec ff_prores_aw_encoder;
+extern AVCodec ff_prores_ks_encoder;
+extern AVCodec ff_prosumer_decoder;
+extern AVCodec ff_psd_decoder;
+extern AVCodec ff_ptx_decoder;
+extern AVCodec ff_qdraw_decoder;
+extern AVCodec ff_qpeg_decoder;
+extern AVCodec ff_qtrle_encoder;
+extern AVCodec ff_qtrle_decoder;
+extern AVCodec ff_r10k_encoder;
+extern AVCodec ff_r10k_decoder;
+extern AVCodec ff_r210_encoder;
+extern AVCodec ff_r210_decoder;
+extern AVCodec ff_rasc_decoder;
+extern AVCodec ff_rawvideo_encoder;
+extern AVCodec ff_rawvideo_decoder;
+extern AVCodec ff_rl2_decoder;
+extern AVCodec ff_roq_encoder;
+extern AVCodec ff_roq_decoder;
+extern AVCodec ff_rpza_encoder;
+extern AVCodec ff_rpza_decoder;
+extern AVCodec ff_rscc_decoder;
+extern AVCodec ff_rv10_encoder;
+extern AVCodec ff_rv10_decoder;
+extern AVCodec ff_rv20_encoder;
+extern AVCodec ff_rv20_decoder;
+extern AVCodec ff_rv30_decoder;
+extern AVCodec ff_rv30_omx_decoder;
+extern AVCodec ff_rv40_decoder;
+extern AVCodec ff_rv40_omx_decoder;
+extern AVCodec ff_s302m_encoder;
+extern AVCodec ff_s302m_decoder;
+extern AVCodec ff_sanm_decoder;
+extern AVCodec ff_scpr_decoder;
+extern AVCodec ff_screenpresso_decoder;
+extern AVCodec ff_sga_decoder;
+extern AVCodec ff_sgi_encoder;
+extern AVCodec ff_sgi_decoder;
+extern AVCodec ff_sgirle_decoder;
+extern AVCodec ff_sheervideo_decoder;
+extern AVCodec ff_simbiosis_imx_decoder;
+extern AVCodec ff_smacker_decoder;
+extern AVCodec ff_smc_decoder;
+extern AVCodec ff_smvjpeg_decoder;
+extern AVCodec ff_snow_encoder;
+extern AVCodec ff_snow_decoder;
+extern AVCodec ff_sp5x_decoder;
+extern AVCodec ff_speedhq_decoder;
+extern AVCodec ff_speedhq_encoder;
+extern AVCodec ff_srgc_decoder;
+extern AVCodec ff_sunrast_encoder;
+extern AVCodec ff_sunrast_decoder;
+extern AVCodec ff_svq1_encoder;
+extern AVCodec ff_svq1_decoder;
+extern AVCodec ff_svq3_decoder;
+extern AVCodec ff_targa_encoder;
+extern AVCodec ff_targa_decoder;
+extern AVCodec ff_targa_y216_decoder;
+extern AVCodec ff_tdsc_decoder;
+extern AVCodec ff_theora_decoder;
+extern AVCodec ff_thp_decoder;
+extern AVCodec ff_tiertexseqvideo_decoder;
+extern AVCodec ff_tiff_encoder;
+extern AVCodec ff_tiff_decoder;
+extern AVCodec ff_tmv_decoder;
+extern AVCodec ff_truemotion1_decoder;
+extern AVCodec ff_truemotion2_decoder;
+extern AVCodec ff_truemotion2rt_decoder;
+extern AVCodec ff_tscc_decoder;
+extern AVCodec ff_tscc2_decoder;
+extern AVCodec ff_txd_decoder;
+extern AVCodec ff_ulti_decoder;
+extern AVCodec ff_utvideo_encoder;
+extern AVCodec ff_utvideo_decoder;
+extern AVCodec ff_v210_encoder;
+extern AVCodec ff_v210_decoder;
+extern AVCodec ff_v210x_decoder;
+extern AVCodec ff_v308_encoder;
+extern AVCodec ff_v308_decoder;
+extern AVCodec ff_v408_encoder;
+extern AVCodec ff_v408_decoder;
+extern AVCodec ff_v410_encoder;
+extern AVCodec ff_v410_decoder;
+extern AVCodec ff_vb_decoder;
+extern AVCodec ff_vble_decoder;
+extern AVCodec ff_vc1_omx_decoder;
+extern AVCodec ff_vc1_decoder;
+extern AVCodec ff_vc1_crystalhd_decoder;
+extern AVCodec ff_vc1image_decoder;
+extern AVCodec ff_vc1_mmal_decoder;
+extern AVCodec ff_vc1_qsv_decoder;
+extern AVCodec ff_vc1_v4l2m2m_decoder;
+extern AVCodec ff_vc2_encoder;
+extern AVCodec ff_vcr1_decoder;
+extern AVCodec ff_vmdvideo_decoder;
+extern AVCodec ff_vmnc_decoder;
+extern AVCodec ff_vp3_decoder;
+extern AVCodec ff_vp4_decoder;
+extern AVCodec ff_vp5_decoder;
+extern AVCodec ff_vp6_omx_decoder;
+extern AVCodec ff_vp6_decoder;
+extern AVCodec ff_vp6a_omx_decoder;
+extern AVCodec ff_vp6a_decoder;
+extern AVCodec ff_vp6f_omx_decoder;
+extern AVCodec ff_vp6f_decoder;
+extern AVCodec ff_vp7_decoder;
+extern AVCodec ff_vp8_omx_decoder;
+extern AVCodec ff_vp8_decoder;
+extern AVCodec ff_vp8_rkmpp_decoder;
+extern AVCodec ff_vp8_v4l2m2m_decoder;
+extern AVCodec ff_vp9_decoder;
+extern AVCodec ff_vp9_rkmpp_decoder;
+extern AVCodec ff_vp9_v4l2m2m_decoder;
+extern AVCodec ff_vqa_decoder;
+extern AVCodec ff_webp_decoder;
+extern AVCodec ff_wcmv_decoder;
+extern AVCodec ff_wrapped_avframe_encoder;
+extern AVCodec ff_wrapped_avframe_decoder;
+extern AVCodec ff_wmv1_encoder;
+extern AVCodec ff_wmv1_decoder;
+extern AVCodec ff_wmv2_encoder;
+extern AVCodec ff_wmv2_decoder;
+extern AVCodec ff_wmv3_omx_decoder;
+extern AVCodec ff_wmv3_decoder;
+extern AVCodec ff_wmv3_crystalhd_decoder;
+extern AVCodec ff_wmv3image_decoder;
+extern AVCodec ff_wnv1_decoder;
+extern AVCodec ff_xan_wc3_decoder;
+extern AVCodec ff_xan_wc4_decoder;
+extern AVCodec ff_xbm_encoder;
+extern AVCodec ff_xbm_decoder;
+extern AVCodec ff_xface_encoder;
+extern AVCodec ff_xface_decoder;
+extern AVCodec ff_xl_decoder;
+extern AVCodec ff_xpm_decoder;
+extern AVCodec ff_xwd_encoder;
+extern AVCodec ff_xwd_decoder;
+extern AVCodec ff_y41p_encoder;
+extern AVCodec ff_y41p_decoder;
+extern AVCodec ff_ylc_decoder;
+extern AVCodec ff_yop_decoder;
+extern AVCodec ff_yuv4_encoder;
+extern AVCodec ff_yuv4_decoder;
+extern AVCodec ff_zero12v_decoder;
+extern AVCodec ff_zerocodec_decoder;
+extern AVCodec ff_zlib_encoder;
+extern AVCodec ff_zlib_decoder;
+extern AVCodec ff_zmbv_encoder;
+extern AVCodec ff_zmbv_decoder;
+
+/* audio codecs */
+extern AVCodec ff_aac_encoder;
+extern AVCodec ff_aac_decoder;
+extern AVCodec ff_aac_fixed_decoder;
+extern AVCodec ff_aac_latm_decoder;
+extern AVCodec ff_ac3_encoder;
+extern AVCodec ff_ac3_decoder;
+extern AVCodec ff_ac3_fixed_encoder;
+extern AVCodec ff_ac3_fixed_decoder;
+extern AVCodec ff_acelp_kelvin_decoder;
+extern AVCodec ff_alac_encoder;
+extern AVCodec ff_alac_decoder;
+extern AVCodec ff_als_decoder;
+extern AVCodec ff_amrnb_decoder;
+extern AVCodec ff_amrwb_decoder;
+extern AVCodec ff_ape_decoder;
+extern AVCodec ff_aptx_encoder;
+extern AVCodec ff_aptx_decoder;
+extern AVCodec ff_aptx_hd_encoder;
+extern AVCodec ff_aptx_hd_decoder;
+extern AVCodec ff_atrac1_decoder;
+extern AVCodec ff_atrac3_decoder;
+extern AVCodec ff_atrac3al_decoder;
+extern AVCodec ff_atrac3p_decoder;
+extern AVCodec ff_atrac3pal_decoder;
+extern AVCodec ff_atrac9_decoder;
+extern AVCodec ff_binkaudio_dct_decoder;
+extern AVCodec ff_binkaudio_rdft_decoder;
+extern AVCodec ff_bmv_audio_decoder;
+extern AVCodec ff_cook_decoder;
+extern AVCodec ff_dca_encoder;
+extern AVCodec ff_dca_decoder;
+extern AVCodec ff_dolby_e_decoder;
+extern AVCodec ff_dsd_lsbf_decoder;
+extern AVCodec ff_dsd_msbf_decoder;
+extern AVCodec ff_dsd_lsbf_planar_decoder;
+extern AVCodec ff_dsd_msbf_planar_decoder;
+extern AVCodec ff_dsicinaudio_decoder;
+extern AVCodec ff_dss_sp_decoder;
+extern AVCodec ff_dst_decoder;
+extern AVCodec ff_eac3_encoder;
+extern AVCodec ff_eac3_decoder;
+extern AVCodec ff_evrc_decoder;
+extern AVCodec ff_fastaudio_decoder;
+extern AVCodec ff_ffwavesynth_decoder;
+extern AVCodec ff_flac_encoder;
+extern AVCodec ff_flac_decoder;
+extern AVCodec ff_g723_1_encoder;
+extern AVCodec ff_g723_1_decoder;
+extern AVCodec ff_g729_decoder;
+extern AVCodec ff_gsm_decoder;
+extern AVCodec ff_gsm_ms_decoder;
+extern AVCodec ff_hca_decoder;
+extern AVCodec ff_hcom_decoder;
+extern AVCodec ff_iac_decoder;
+extern AVCodec ff_ilbc_decoder;
+extern AVCodec ff_imc_decoder;
+extern AVCodec ff_interplay_acm_decoder;
+extern AVCodec ff_mace3_decoder;
+extern AVCodec ff_mace6_decoder;
+extern AVCodec ff_metasound_decoder;
+extern AVCodec ff_mlp_encoder;
+extern AVCodec ff_mlp_decoder;
+extern AVCodec ff_mp1_decoder;
+extern AVCodec ff_mp1float_decoder;
+extern AVCodec ff_mp2_encoder;
+extern AVCodec ff_mp2_decoder;
+extern AVCodec ff_mp2float_decoder;
+extern AVCodec ff_mp2fixed_encoder;
+extern AVCodec ff_mp3float_decoder;
+extern AVCodec ff_mp3_decoder;
+extern AVCodec ff_mp3adufloat_decoder;
+extern AVCodec ff_mp3adu_decoder;
+extern AVCodec ff_mp3on4float_decoder;
+extern AVCodec ff_mp3on4_decoder;
+extern AVCodec ff_mpc7_decoder;
+extern AVCodec ff_mpc8_decoder;
+extern AVCodec ff_nellymoser_encoder;
+extern AVCodec ff_nellymoser_decoder;
+extern AVCodec ff_on2avc_decoder;
+extern AVCodec ff_opus_encoder;
+extern AVCodec ff_opus_decoder;
+extern AVCodec ff_paf_audio_decoder;
+extern AVCodec ff_qcelp_decoder;
+extern AVCodec ff_qdm2_decoder;
+extern AVCodec ff_qdmc_decoder;
+extern AVCodec ff_ra_144_encoder;
+extern AVCodec ff_ra_144_decoder;
+extern AVCodec ff_ra_288_decoder;
+extern AVCodec ff_ralf_decoder;
+extern AVCodec ff_sbc_encoder;
+extern AVCodec ff_sbc_decoder;
+extern AVCodec ff_shorten_decoder;
+extern AVCodec ff_sipr_decoder;
+extern AVCodec ff_siren_decoder;
+extern AVCodec ff_smackaud_decoder;
+extern AVCodec ff_sonic_encoder;
+extern AVCodec ff_sonic_decoder;
+extern AVCodec ff_sonic_ls_encoder;
+extern AVCodec ff_tak_decoder;
+extern AVCodec ff_truehd_encoder;
+extern AVCodec ff_truehd_decoder;
+extern AVCodec ff_truespeech_decoder;
+extern AVCodec ff_tta_encoder;
+extern AVCodec ff_tta_decoder;
+extern AVCodec ff_twinvq_decoder;
+extern AVCodec ff_vmdaudio_decoder;
+extern AVCodec ff_vorbis_encoder;
+extern AVCodec ff_vorbis_decoder;
+extern AVCodec ff_wavpack_encoder;
+extern AVCodec ff_wavpack_decoder;
+extern AVCodec ff_wmalossless_decoder;
+extern AVCodec ff_wmapro_decoder;
+extern AVCodec ff_wmav1_encoder;
+extern AVCodec ff_wmav1_decoder;
+extern AVCodec ff_wmav2_encoder;
+extern AVCodec ff_wmav2_decoder;
+extern AVCodec ff_wmavoice_decoder;
+extern AVCodec ff_ws_snd1_decoder;
+extern AVCodec ff_xma1_decoder;
+extern AVCodec ff_xma2_decoder;
+
+/* PCM codecs */
+extern AVCodec ff_pcm_alaw_encoder;
+extern AVCodec ff_pcm_alaw_decoder;
+extern AVCodec ff_pcm_bluray_decoder;
+extern AVCodec ff_pcm_dvd_encoder;
+extern AVCodec ff_pcm_dvd_decoder;
+extern AVCodec ff_pcm_f16le_decoder;
+extern AVCodec ff_pcm_f24le_decoder;
+extern AVCodec ff_pcm_f32be_encoder;
+extern AVCodec ff_pcm_f32be_decoder;
+extern AVCodec ff_pcm_f32le_encoder;
+extern AVCodec ff_pcm_f32le_decoder;
+extern AVCodec ff_pcm_f64be_encoder;
+extern AVCodec ff_pcm_f64be_decoder;
+extern AVCodec ff_pcm_f64le_encoder;
+extern AVCodec ff_pcm_f64le_decoder;
+extern AVCodec ff_pcm_lxf_decoder;
+extern AVCodec ff_pcm_mulaw_encoder;
+extern AVCodec ff_pcm_mulaw_decoder;
+extern AVCodec ff_pcm_s8_encoder;
+extern AVCodec ff_pcm_s8_decoder;
+extern AVCodec ff_pcm_s8_planar_encoder;
+extern AVCodec ff_pcm_s8_planar_decoder;
+extern AVCodec ff_pcm_s16be_encoder;
+extern AVCodec ff_pcm_s16be_decoder;
+extern AVCodec ff_pcm_s16be_planar_encoder;
+extern AVCodec ff_pcm_s16be_planar_decoder;
+extern AVCodec ff_pcm_s16le_encoder;
+extern AVCodec ff_pcm_s16le_decoder;
+extern AVCodec ff_pcm_s16le_planar_encoder;
+extern AVCodec ff_pcm_s16le_planar_decoder;
+extern AVCodec ff_pcm_s24be_encoder;
+extern AVCodec ff_pcm_s24be_decoder;
+extern AVCodec ff_pcm_s24daud_encoder;
+extern AVCodec ff_pcm_s24daud_decoder;
+extern AVCodec ff_pcm_s24le_encoder;
+extern AVCodec ff_pcm_s24le_decoder;
+extern AVCodec ff_pcm_s24le_planar_encoder;
+extern AVCodec ff_pcm_s24le_planar_decoder;
+extern AVCodec ff_pcm_s32be_encoder;
+extern AVCodec ff_pcm_s32be_decoder;
+extern AVCodec ff_pcm_s32le_encoder;
+extern AVCodec ff_pcm_s32le_decoder;
+extern AVCodec ff_pcm_s32le_planar_encoder;
+extern AVCodec ff_pcm_s32le_planar_decoder;
+extern AVCodec ff_pcm_s64be_encoder;
+extern AVCodec ff_pcm_s64be_decoder;
+extern AVCodec ff_pcm_s64le_encoder;
+extern AVCodec ff_pcm_s64le_decoder;
+extern AVCodec ff_pcm_sga_decoder;
+extern AVCodec ff_pcm_u8_encoder;
+extern AVCodec ff_pcm_u8_decoder;
+extern AVCodec ff_pcm_u16be_encoder;
+extern AVCodec ff_pcm_u16be_decoder;
+extern AVCodec ff_pcm_u16le_encoder;
+extern AVCodec ff_pcm_u16le_decoder;
+extern AVCodec ff_pcm_u24be_encoder;
+extern AVCodec ff_pcm_u24be_decoder;
+extern AVCodec ff_pcm_u24le_encoder;
+extern AVCodec ff_pcm_u24le_decoder;
+extern AVCodec ff_pcm_u32be_encoder;
+extern AVCodec ff_pcm_u32be_decoder;
+extern AVCodec ff_pcm_u32le_encoder;
+extern AVCodec ff_pcm_u32le_decoder;
+extern AVCodec ff_pcm_vidc_encoder;
+extern AVCodec ff_pcm_vidc_decoder;
+
+/* DPCM codecs */
+extern AVCodec ff_derf_dpcm_decoder;
+extern AVCodec ff_gremlin_dpcm_decoder;
+extern AVCodec ff_interplay_dpcm_decoder;
+extern AVCodec ff_roq_dpcm_encoder;
+extern AVCodec ff_roq_dpcm_decoder;
+extern AVCodec ff_sdx2_dpcm_decoder;
+extern AVCodec ff_sol_dpcm_decoder;
+extern AVCodec ff_xan_dpcm_decoder;
+
+/* ADPCM codecs */
+extern AVCodec ff_adpcm_4xm_decoder;
+extern AVCodec ff_adpcm_adx_encoder;
+extern AVCodec ff_adpcm_adx_decoder;
+extern AVCodec ff_adpcm_afc_decoder;
+extern AVCodec ff_adpcm_agm_decoder;
+extern AVCodec ff_adpcm_aica_decoder;
+extern AVCodec ff_adpcm_argo_decoder;
+extern AVCodec ff_adpcm_argo_encoder;
+extern AVCodec ff_adpcm_ct_decoder;
+extern AVCodec ff_adpcm_dtk_decoder;
+extern AVCodec ff_adpcm_ea_decoder;
+extern AVCodec ff_adpcm_ea_maxis_xa_decoder;
+extern AVCodec ff_adpcm_ea_r1_decoder;
+extern AVCodec ff_adpcm_ea_r2_decoder;
+extern AVCodec ff_adpcm_ea_r3_decoder;
+extern AVCodec ff_adpcm_ea_xas_decoder;
+extern AVCodec ff_adpcm_g722_encoder;
+extern AVCodec ff_adpcm_g722_decoder;
+extern AVCodec ff_adpcm_g726_encoder;
+extern AVCodec ff_adpcm_g726_decoder;
+extern AVCodec ff_adpcm_g726le_encoder;
+extern AVCodec ff_adpcm_g726le_decoder;
+extern AVCodec ff_adpcm_ima_amv_decoder;
+extern AVCodec ff_adpcm_ima_amv_encoder;
+extern AVCodec ff_adpcm_ima_alp_decoder;
+extern AVCodec ff_adpcm_ima_alp_encoder;
+extern AVCodec ff_adpcm_ima_apc_decoder;
+extern AVCodec ff_adpcm_ima_apm_decoder;
+extern AVCodec ff_adpcm_ima_apm_encoder;
+extern AVCodec ff_adpcm_ima_cunning_decoder;
+extern AVCodec ff_adpcm_ima_dat4_decoder;
+extern AVCodec ff_adpcm_ima_dk3_decoder;
+extern AVCodec ff_adpcm_ima_dk4_decoder;
+extern AVCodec ff_adpcm_ima_ea_eacs_decoder;
+extern AVCodec ff_adpcm_ima_ea_sead_decoder;
+extern AVCodec ff_adpcm_ima_iss_decoder;
+extern AVCodec ff_adpcm_ima_moflex_decoder;
+extern AVCodec ff_adpcm_ima_mtf_decoder;
+extern AVCodec ff_adpcm_ima_oki_decoder;
+extern AVCodec ff_adpcm_ima_qt_encoder;
+extern AVCodec ff_adpcm_ima_qt_decoder;
+extern AVCodec ff_adpcm_ima_rad_decoder;
+extern AVCodec ff_adpcm_ima_ssi_decoder;
+extern AVCodec ff_adpcm_ima_ssi_encoder;
+extern AVCodec ff_adpcm_ima_smjpeg_decoder;
+extern AVCodec ff_adpcm_ima_wav_encoder;
+extern AVCodec ff_adpcm_ima_wav_decoder;
+extern AVCodec ff_adpcm_ima_ws_decoder;
+extern AVCodec ff_adpcm_ms_encoder;
+extern AVCodec ff_adpcm_ms_decoder;
+extern AVCodec ff_adpcm_mtaf_decoder;
+extern AVCodec ff_adpcm_psx_decoder;
+extern AVCodec ff_adpcm_sbpro_2_decoder;
+extern AVCodec ff_adpcm_sbpro_3_decoder;
+extern AVCodec ff_adpcm_sbpro_4_decoder;
+extern AVCodec ff_adpcm_swf_encoder;
+extern AVCodec ff_adpcm_swf_decoder;
+extern AVCodec ff_adpcm_thp_decoder;
+extern AVCodec ff_adpcm_thp_le_decoder;
+extern AVCodec ff_adpcm_vima_decoder;
+extern AVCodec ff_adpcm_xa_decoder;
+extern AVCodec ff_adpcm_yamaha_encoder;
+extern AVCodec ff_adpcm_yamaha_decoder;
+extern AVCodec ff_adpcm_zork_decoder;
+
+/* subtitles */
+extern AVCodec ff_ssa_encoder;
+extern AVCodec ff_ssa_decoder;
+extern AVCodec ff_ass_encoder;
+extern AVCodec ff_ass_decoder;
+extern AVCodec ff_ccaption_decoder;
+extern AVCodec ff_dvbsub_encoder;
+extern AVCodec ff_dvbsub_decoder;
+extern AVCodec ff_dvdsub_encoder;
+extern AVCodec ff_dvdsub_decoder;
+extern AVCodec ff_jacosub_decoder;
+extern AVCodec ff_microdvd_decoder;
+extern AVCodec ff_movtext_encoder;
+extern AVCodec ff_movtext_decoder;
+extern AVCodec ff_mpl2_decoder;
+extern AVCodec ff_pgssub_decoder;
+extern AVCodec ff_pjs_decoder;
+extern AVCodec ff_realtext_decoder;
+extern AVCodec ff_sami_decoder;
+extern AVCodec ff_srt_encoder;
+extern AVCodec ff_srt_decoder;
+extern AVCodec ff_stl_decoder;
+extern AVCodec ff_subrip_encoder;
+extern AVCodec ff_subrip_decoder;
+extern AVCodec ff_subviewer_decoder;
+extern AVCodec ff_subviewer1_decoder;
+extern AVCodec ff_text_encoder;
+extern AVCodec ff_text_decoder;
+extern AVCodec ff_ttml_encoder;
+extern AVCodec ff_vplayer_decoder;
+extern AVCodec ff_webvtt_encoder;
+extern AVCodec ff_webvtt_decoder;
+extern AVCodec ff_xsub_encoder;
+extern AVCodec ff_xsub_decoder;
+
+/* external libraries */
+extern AVCodec ff_aac_at_encoder;
+extern AVCodec ff_aac_at_decoder;
+extern AVCodec ff_ac3_at_decoder;
+extern AVCodec ff_adpcm_ima_qt_at_decoder;
+extern AVCodec ff_alac_at_encoder;
+extern AVCodec ff_alac_at_decoder;
+extern AVCodec ff_amr_nb_at_decoder;
+extern AVCodec ff_eac3_at_decoder;
+extern AVCodec ff_gsm_ms_at_decoder;
+extern AVCodec ff_ilbc_at_encoder;
+extern AVCodec ff_ilbc_at_decoder;
+extern AVCodec ff_mp1_at_decoder;
+extern AVCodec ff_mp2_at_decoder;
+extern AVCodec ff_mp3_at_decoder;
+extern AVCodec ff_pcm_alaw_at_encoder;
+extern AVCodec ff_pcm_alaw_at_decoder;
+extern AVCodec ff_pcm_mulaw_at_encoder;
+extern AVCodec ff_pcm_mulaw_at_decoder;
+extern AVCodec ff_qdmc_at_decoder;
+extern AVCodec ff_qdm2_at_decoder;
+extern AVCodec ff_libaom_av1_encoder;
+extern AVCodec ff_libaribb24_decoder;
+extern AVCodec ff_libcelt_decoder;
+extern AVCodec ff_libcodec2_encoder;
+extern AVCodec ff_libcodec2_decoder;
+extern AVCodec ff_libdav1d_decoder;
+extern AVCodec ff_libdavs2_decoder;
+extern AVCodec ff_libfdk_aac_encoder;
+extern AVCodec ff_libfdk_aac_decoder;
+extern AVCodec ff_libgsm_encoder;
+extern AVCodec ff_libgsm_decoder;
+extern AVCodec ff_libgsm_ms_encoder;
+extern AVCodec ff_libgsm_ms_decoder;
+extern AVCodec ff_libilbc_encoder;
+extern AVCodec ff_libilbc_decoder;
+extern AVCodec ff_libmp3lame_encoder;
+extern AVCodec ff_libopencore_amrnb_encoder;
+extern AVCodec ff_libopencore_amrnb_decoder;
+extern AVCodec ff_libopencore_amrwb_decoder;
+extern AVCodec ff_libopenjpeg_encoder;
+extern AVCodec ff_libopenjpeg_decoder;
+extern AVCodec ff_libopus_encoder;
+extern AVCodec ff_libopus_decoder;
+extern AVCodec ff_librav1e_encoder;
+extern AVCodec ff_librsvg_decoder;
+extern AVCodec ff_libshine_encoder;
+extern AVCodec ff_libspeex_encoder;
+extern AVCodec ff_libspeex_decoder;
+extern AVCodec ff_libsvtav1_encoder;
+extern AVCodec ff_libtheora_encoder;
+extern AVCodec ff_libtwolame_encoder;
+extern AVCodec ff_libuavs3d_decoder;
+extern AVCodec ff_libvo_amrwbenc_encoder;
+extern AVCodec ff_libvorbis_encoder;
+extern AVCodec ff_libvorbis_decoder;
+extern AVCodec ff_libvpx_vp8_encoder;
+extern AVCodec ff_libvpx_vp8_decoder;
+extern AVCodec ff_libvpx_vp9_encoder;
+extern AVCodec ff_libvpx_vp9_decoder;
+/* preferred over libwebp */
+extern AVCodec ff_libwebp_anim_encoder;
+extern AVCodec ff_libwebp_encoder;
+extern AVCodec ff_libx262_encoder;
+extern AVCodec ff_libx264_encoder;
+extern AVCodec ff_libx264rgb_encoder;
+extern AVCodec ff_libx265_encoder;
+extern AVCodec ff_libxavs_encoder;
+extern AVCodec ff_libxavs2_encoder;
+extern AVCodec ff_libxvid_encoder;
+extern AVCodec ff_libzvbi_teletext_decoder;
+
+/* text */
+extern AVCodec ff_bintext_decoder;
+extern AVCodec ff_xbin_decoder;
+extern AVCodec ff_idf_decoder;
+
+/* external libraries, that shouldn't be used by default if one of the
+ * above is available */
+extern AVCodec ff_aac_mf_encoder;
+extern AVCodec ff_ac3_mf_encoder;
+extern AVCodec ff_h263_v4l2m2m_encoder;
+extern AVCodec ff_libaom_av1_decoder;
+/* hwaccel hooks only, so prefer external decoders */
+extern AVCodec ff_av1_decoder;
+extern AVCodec ff_av1_cuvid_decoder;
+extern AVCodec ff_av1_qsv_decoder;
+extern AVCodec ff_libopenh264_encoder;
+extern AVCodec ff_libopenh264_decoder;
+extern AVCodec ff_h264_amf_encoder;
+extern AVCodec ff_h264_cuvid_decoder;
+extern AVCodec ff_h264_mf_encoder;
+extern AVCodec ff_h264_nvenc_encoder;
+extern AVCodec ff_h264_omx_encoder;
+extern AVCodec ff_h264_qsv_encoder;
+extern AVCodec ff_h264_v4l2m2m_encoder;
+extern AVCodec ff_h264_vaapi_encoder;
+extern AVCodec ff_h264_videotoolbox_encoder;
+#if FF_API_NVENC_OLD_NAME
+extern AVCodec ff_nvenc_encoder;
+extern AVCodec ff_nvenc_h264_encoder;
+extern AVCodec ff_nvenc_hevc_encoder;
+#endif
+extern AVCodec ff_hevc_amf_encoder;
+extern AVCodec ff_hevc_cuvid_decoder;
+extern AVCodec ff_hevc_mediacodec_decoder;
+extern AVCodec ff_hevc_mf_encoder;
+extern AVCodec ff_hevc_nvenc_encoder;
+extern AVCodec ff_hevc_qsv_encoder;
+extern AVCodec ff_hevc_v4l2m2m_encoder;
+extern AVCodec ff_hevc_vaapi_encoder;
+extern AVCodec ff_hevc_videotoolbox_encoder;
+extern AVCodec ff_libkvazaar_encoder;
+extern AVCodec ff_mjpeg_cuvid_decoder;
+extern AVCodec ff_mjpeg_qsv_encoder;
+extern AVCodec ff_mjpeg_qsv_decoder;
+extern AVCodec ff_mjpeg_vaapi_encoder;
+extern AVCodec ff_mp3_mf_encoder;
+extern AVCodec ff_mpeg1_cuvid_decoder;
+extern AVCodec ff_mpeg2_cuvid_decoder;
+extern AVCodec ff_mpeg2_qsv_encoder;
+extern AVCodec ff_mpeg2_vaapi_encoder;
+extern AVCodec ff_mpeg4_cuvid_decoder;
+extern AVCodec ff_mpeg4_mediacodec_decoder;
+extern AVCodec ff_mpeg4_omx_encoder;
+extern AVCodec ff_mpeg4_v4l2m2m_encoder;
+extern AVCodec ff_vc1_cuvid_decoder;
+extern AVCodec ff_vp8_cuvid_decoder;
+extern AVCodec ff_vp8_mediacodec_decoder;
+extern AVCodec ff_vp8_qsv_decoder;
+extern AVCodec ff_vp8_v4l2m2m_encoder;
+extern AVCodec ff_vp8_vaapi_encoder;
+extern AVCodec ff_vp9_cuvid_decoder;
+extern AVCodec ff_vp9_mediacodec_decoder;
+extern AVCodec ff_vp9_qsv_decoder;
+extern AVCodec ff_vp9_vaapi_encoder;
+extern AVCodec ff_vp9_qsv_encoder;
+
+// The iterate API is not usable with ossfuzz due to the excessive size of binaries created
+#if CONFIG_OSSFUZZ
+AVCodec * codec_list[] = {
+ NULL,
+ NULL,
+ NULL
+};
+#else
+#include "libavcodec/codec_list.c"
+#endif
+
+static AVOnce av_codec_static_init = AV_ONCE_INIT;
+static void av_codec_init_static(void)
+{
+ for (int i = 0; codec_list[i]; i++) {
+ if (codec_list[i]->init_static_data)
+ codec_list[i]->init_static_data((AVCodec*)codec_list[i]);
+ }
+}
+
+const AVCodec *av_codec_iterate(void **opaque)
+{
+ uintptr_t i = (uintptr_t)*opaque;
+ const AVCodec *c = codec_list[i];
+
+ ff_thread_once(&av_codec_static_init, av_codec_init_static);
+
+ if (c)
+ *opaque = (void*)(i + 1);
+
+ return c;
+}
+
+#if FF_API_NEXT
+FF_DISABLE_DEPRECATION_WARNINGS
+static AVOnce av_codec_next_init = AV_ONCE_INIT;
+
+static void av_codec_init_next(void)
+{
+ AVCodec *prev = NULL, *p;
+ void *i = 0;
+ while ((p = (AVCodec*)av_codec_iterate(&i))) {
+ if (prev)
+ prev->next = p;
+ prev = p;
+ }
+}
+
+
+
+av_cold void avcodec_register(AVCodec *codec)
+{
+ ff_thread_once(&av_codec_next_init, av_codec_init_next);
+}
+
+AVCodec *av_codec_next(const AVCodec *c)
+{
+ ff_thread_once(&av_codec_next_init, av_codec_init_next);
+
+ if (c)
+ return c->next;
+ else
+ return (AVCodec*)codec_list[0];
+}
+
+void avcodec_register_all(void)
+{
+ ff_thread_once(&av_codec_next_init, av_codec_init_next);
+}
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
+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_codec(enum AVCodecID id, int (*x)(const AVCodec *))
+{
+ const AVCodec *p, *experimental = NULL;
+ void *i = 0;
+
+ id = remap_deprecated_codec_id(id);
+
+ while ((p = av_codec_iterate(&i))) {
+ if (!x(p))
+ continue;
+ if (p->id == id) {
+ if (p->capabilities & AV_CODEC_CAP_EXPERIMENTAL && !experimental) {
+ experimental = p;
+ } else
+ return (AVCodec*)p;
+ }
+ }
+
+ return (AVCodec*)experimental;
+}
+
+AVCodec *avcodec_find_encoder(enum AVCodecID id)
+{
+ return find_codec(id, av_codec_is_encoder);
+}
+
+AVCodec *avcodec_find_decoder(enum AVCodecID id)
+{
+ return find_codec(id, av_codec_is_decoder);
+}
+
+static AVCodec *find_codec_by_name(const char *name, int (*x)(const AVCodec *))
+{
+ void *i = 0;
+ const AVCodec *p;
+
+ if (!name)
+ return NULL;
+
+ while ((p = av_codec_iterate(&i))) {
+ if (!x(p))
+ continue;
+ if (strcmp(name, p->name) == 0)
+ return (AVCodec*)p;
+ }
+
+ return NULL;
+}
+
+AVCodec *avcodec_find_encoder_by_name(const char *name)
+{
+ return find_codec_by_name(name, av_codec_is_encoder);
+}
+
+AVCodec *avcodec_find_decoder_by_name(const char *name)
+{
+ return find_codec_by_name(name, av_codec_is_decoder);
+}
Index: omxdec.c
===================================================================
--- omxdec.c (nonexistent)
+++ omxdec.c (revision 377)
@@ -0,0 +1,1796 @@
+/*
+ * OMX Video decoder
+ *
+ * Copyright (C) 2022 Baikal Electronics, JSC
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <pthread.h>
+#include <dlfcn.h>
+#include <time.h>
+
+#include <stdatomic.h>
+
+#include "libavutil/avstring.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
+#include "libavutil/log.h"
+#if CONFIG_OMX_IMG
+#include "libswscale/swscale.h"
+#endif /* CONFIG_OMX_IMG */
+
+#include "avcodec.h"
+#include "h264.h"
+#include "internal.h"
+
+#include <OMX_Core.h>
+#include <OMX_Component.h>
+#include <OMX_RoleNames.h>
+#include <OMX_IndexExt.h>
+#include <OMX_VideoExt.h>
+
+#define OMX_DECODER_VERSION_MAJOR (1)
+#define OMX_DECODER_VERSION_MINOR (2)
+#define OMX_DECODER_VERSION_REVISION (0)
+#define OMX_DECODER_VERSION_STEP (0)
+
+#define OMX_STATE_TIMEOUT 5
+#define OMX_OUTPUT_TIMEOUT 1
+#define OMX_INPUT_QUEUE_THRESHOLD 4
+
+static const char * const omx_core_libraries[] = {
+#if CONFIG_OMX_IMG
+ "libomx_vxd.so",
+#else
+ "libOMX_Core.so",
+ "libOmxCore.so",
+#endif /* CONFIG_OMX_IMG */
+ NULL
+};
+
+#ifdef OMX_SKIP64BIT
+static OMX_TICKS to_omx_ticks(int64_t value)
+{
+ OMX_TICKS res;
+ s.nLowPart = value & 0xffffffff;
+ s.nHighPart = value >> 32;
+ return res;
+}
+static int64_t from_omx_ticks(OMX_TICKS value)
+{
+ return (((int64_t)value.nHighPart) << 32) | value.nLowPart;
+}
+#else
+#define to_omx_ticks(value) (value)
+#define from_omx_ticks(value) (value)
+#endif
+
+#define OMX_INIT_STRUCT(p) do { \
+ memset ((p), 0, sizeof (*(p))); \
+ (p)->nSize = sizeof (*(p)); \
+ (p)->nVersion.s.nVersionMajor = OMX_DECODER_VERSION_MAJOR; \
+ (p)->nVersion.s.nVersionMinor = OMX_DECODER_VERSION_MINOR; \
+ (p)->nVersion.s.nRevision = OMX_DECODER_VERSION_REVISION; \
+ (p)->nVersion.s.nStep = OMX_DECODER_VERSION_STEP; \
+} while (0)
+
+typedef struct _OMXCore OMXCore;
+typedef struct _OMXCodecContext OMXCodecContext;
+typedef struct _OMXCodecPort OMXCodecPort;
+typedef struct _OMXInputBuffer OMXInputBuffer;
+typedef struct _OMXBufferHeader OMXBufferHeader;
+
+struct _OMXCore {
+ void *handle;
+ OMX_ERRORTYPE (*pInit)(void);
+ OMX_ERRORTYPE (*pDeinit)(void);
+ OMX_ERRORTYPE (*pComponentNameEnum)(OMX_STRING, OMX_U32, OMX_U32);
+ OMX_ERRORTYPE (*pGetHandle)(OMX_HANDLETYPE*, OMX_STRING, OMX_PTR,
+ OMX_CALLBACKTYPE*);
+ OMX_ERRORTYPE (*pFreeHandle)(OMX_HANDLETYPE);
+#if CONFIG_OMX_IMG
+ OMX_ERRORTYPE (*pComponentOfRoleEnum)(OMX_STRING, OMX_STRING, OMX_U32);
+#else
+ OMX_ERRORTYPE (*pGetComponentsOfRole)(OMX_STRING, OMX_U32*, OMX_U8**);
+#endif /* CONFIG_OMX_IMG */
+};
+
+struct _OMXInputBuffer {
+ AVBufferRef *ref;
+ void *data;
+ size_t size;
+ int64_t pts;
+ OMX_U32 flags;
+ OMXInputBuffer *next;
+};
+
+struct _OMXBufferHeader {
+ OMX_BUFFERHEADERTYPE *header;
+ OMXCodecPort *port;
+ int decoding;
+ void *priv;
+ OMXBufferHeader *next;
+};
+
+struct _OMXCodecPort {
+ int index;
+ OMX_PARAM_PORTDEFINITIONTYPE port_def;
+ // number of port buffers
+ int num_buffers;
+ // buffer headers pool
+ OMXBufferHeader *headers;
+ // number of headers in pool
+ atomic_int num_headers;
+ // headers pool lock
+ pthread_mutex_t mutex;
+ OMXCodecContext *ctx;
+};
+
+struct _OMXCodecContext {
+ const AVClass *class;
+
+ AVCodecContext *avctx;
+
+ char *libname;
+ OMXCore *core;
+
+ char component_name[OMX_MAX_STRINGNAME_SIZE];
+ OMX_HANDLETYPE handle;
+
+ int stride, plane_size;
+
+ OMXCodecPort in;
+ // lock free (accessed by omx_decode only)
+ OMXInputBuffer *in_queue_head, *in_queue_tail;
+ int in_queue_size;
+
+ OMXCodecPort out;
+ OMXBufferHeader *out_queue_head, *out_queue_tail;
+ int out_queue_size;
+ pthread_mutex_t out_queue_mutex;
+ pthread_cond_t out_queue_cond;
+#if !CONFIG_OMX_IMG
+ uint8_t *output_buf;
+ int output_buf_size;
+#endif /* !CONFIG_OMX_IMG */
+ int settings_changed;
+#if CONFIG_OMX_IMG
+ struct SwsContext *sws_ctx;
+ enum AVPixelFormat decoder_pix_fmt;
+#endif /* CONFIG_OMX_IMG */
+
+ int flushing;
+
+ pthread_mutex_t state_mutex;
+ pthread_cond_t state_cond;
+ OMX_STATETYPE state;
+ OMX_ERRORTYPE error;
+
+ int eos_sent, eos_received;
+ int extradata_sent;
+};
+
+static av_cold int omx_core_load(OMXCore *core, void *logctx,
+ const char *libname)
+{
+ core->handle = dlopen(libname, RTLD_LOCAL | RTLD_NOW);
+ if (!core->handle) {
+ av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname);
+ return -1;
+ }
+ core->pInit = dlsym(core->handle, "OMX_Init");
+ core->pDeinit = dlsym(core->handle, "OMX_Deinit");
+ core->pGetHandle = dlsym(core->handle, "OMX_GetHandle");
+ core->pFreeHandle = dlsym(core->handle, "OMX_FreeHandle");
+#if CONFIG_OMX_IMG
+ core->pComponentOfRoleEnum = dlsym(core->handle, "OMX_ComponentOfRoleEnum");
+#else
+ core->pGetComponentsOfRole = dlsym(core->handle, "OMX_GetComponentsOfRole");
+#endif /* CONFIG_OMX_IMG */
+ if (!core->pInit || !core->pDeinit || !core->pGetHandle ||
+ !core->pFreeHandle ||
+#if CONFIG_OMX_IMG
+ !core->pComponentOfRoleEnum
+#else
+ !core->pGetComponentsOfRole
+#endif /* CONFIG_OMX_IMG */
+ ) {
+ av_log(logctx, AV_LOG_WARNING, "Not all functions found in %s\n",
+ libname);
+ dlclose(core->handle);
+ core->handle = NULL;
+ return -1;
+ }
+ return 0;
+}
+
+static const char *omx_error_string(OMX_ERRORTYPE err)
+{
+ switch (err) {
+ case OMX_ErrorNone:
+ return "None";
+ case OMX_ErrorInsufficientResources:
+ return "Insufficient resources";
+ case OMX_ErrorUndefined:
+ return "Undefined";
+ case OMX_ErrorInvalidComponentName:
+ return "Invalid component name";
+ case OMX_ErrorComponentNotFound:
+ return "Component not found";
+ case OMX_ErrorInvalidComponent:
+ return "Invalid component";
+ case OMX_ErrorBadParameter:
+ return "Bad parameter";
+ case OMX_ErrorNotImplemented:
+ return "Not implemented";
+ case OMX_ErrorUnderflow:
+ return "Underflow";
+ case OMX_ErrorOverflow:
+ return "Overflow";
+ case OMX_ErrorHardware:
+ return "Hardware";
+ case OMX_ErrorInvalidState:
+ return "Invalid state";
+ case OMX_ErrorStreamCorrupt:
+ return "Stream corrupt";
+ case OMX_ErrorPortsNotCompatible:
+ return "Ports not compatible";
+ case OMX_ErrorResourcesLost:
+ return "Resources lost";
+ case OMX_ErrorNoMore:
+ return "No more";
+ case OMX_ErrorVersionMismatch:
+ return "Version mismatch";
+ case OMX_ErrorNotReady:
+ return "Not ready";
+ case OMX_ErrorTimeout:
+ return "Timeout";
+ case OMX_ErrorSameState:
+ return "Same state";
+ case OMX_ErrorResourcesPreempted:
+ return "Resources preempted";
+ case OMX_ErrorPortUnresponsiveDuringAllocation:
+ return "Port unresponsive during allocation";
+ case OMX_ErrorPortUnresponsiveDuringDeallocation:
+ return "Port unresponsive during deallocation";
+ case OMX_ErrorPortUnresponsiveDuringStop:
+ return "Port unresponsive during stop";
+ case OMX_ErrorIncorrectStateTransition:
+ return "Incorrect state transition";
+ case OMX_ErrorIncorrectStateOperation:
+ return "Incorrect state operation";
+ case OMX_ErrorUnsupportedSetting:
+ return "Unsupported setting";
+ case OMX_ErrorUnsupportedIndex:
+ return "Unsupported index";
+ case OMX_ErrorBadPortIndex:
+ return "Bad port index";
+ case OMX_ErrorPortUnpopulated:
+ return "Port unpopulated";
+ case OMX_ErrorComponentSuspended:
+ return "Component suspended";
+ case OMX_ErrorDynamicResourcesUnavailable:
+ return "Dynamic resources unavailable";
+ case OMX_ErrorMbErrorsInFrame:
+ return "Macroblock errors in frame";
+ case OMX_ErrorFormatNotDetected:
+ return "Format not detected";
+ case OMX_ErrorContentPipeOpenFailed:
+ return "Content pipe open failed";
+ case OMX_ErrorContentPipeCreationFailed:
+ return "Content pipe creation failed";
+ case OMX_ErrorSeperateTablesUsed:
+ return "Separate tables used";
+ case OMX_ErrorTunnelingUnsupported:
+ return "Tunneling unsupported";
+ default:
+ if (err >= OMX_ErrorKhronosExtensions &&
+ err < OMX_ErrorVendorStartUnused)
+ return "Khronos extension error";
+ else if (err >= OMX_ErrorVendorStartUnused &&
+ err < OMX_ErrorMax)
+ return "Vendor specific error";
+ else
+ return "Unknown error";
+ }
+}
+
+static av_cold OMXCore *omx_core_init(void *logctx, const char *libname)
+{
+ OMXCore *core;
+ int loaded = 0;
+ OMX_ERRORTYPE err;
+
+ core = av_mallocz(sizeof(*core));
+ if (!core) {
+ av_log(logctx, AV_LOG_ERROR,
+ "Core initialization error: Not enough memory\n");
+ return NULL;
+ }
+
+ if (libname)
+ loaded = (omx_core_load(core, logctx, libname) == 0);
+ else {
+ int i;
+
+ for (i = 0; omx_core_libraries[i] && !loaded; i++)
+ loaded = (omx_core_load(core, logctx, omx_core_libraries[i]) == 0);
+ }
+ if (!loaded) {
+ av_log(logctx, AV_LOG_ERROR,
+ "Core initialization error: Core library not found\n");
+ av_free(core);
+ return NULL;
+ }
+
+ err = core->pInit();
+ if (err != OMX_ErrorNone) {
+ av_log(logctx, AV_LOG_ERROR,
+ "Core initialization error: %s\n", omx_error_string(err));
+ dlclose(core->handle);
+ av_free(core);
+ return NULL;
+ }
+
+ return core;
+}
+
+static av_cold void omx_core_destroy(OMXCore *core)
+{
+ if (core) {
+ core->pDeinit();
+ dlclose(core->handle);
+ av_free(core);
+ }
+}
+
+#if !CONFIG_OMX_IMG
+static av_cold int omx_component_find(OMXCodecContext *ctx,
+ const char *role, char *str, int str_size)
+{
+ AVCodecContext *avctx = ctx->avctx;
+ int ret = 0;
+ OMX_U32 i, num = 0;
+ char **components;
+
+ ctx->core->pGetComponentsOfRole((OMX_STRING) role, &num, NULL);
+ if (!num) {
+ av_log(avctx, AV_LOG_ERROR, "No component for role %s found\n", role);
+ return -1;
+ }
+ components = av_mallocz_array(num, sizeof(*components));
+ if (!components) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Component search error: Not enough memory\n");
+ return -1;
+ }
+ for (i = 0; i < num; i++) {
+ components[i] = av_mallocz(OMX_MAX_STRINGNAME_SIZE);
+ if (!components[i]) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Component search error: Not enough memory\n");
+ ret = -1;
+ goto end;
+ }
+ }
+ ctx->core->pGetComponentsOfRole((OMX_STRING) role, &num,
+ (OMX_U8**) components);
+ av_strlcpy(str, components[0], str_size);
+end:
+ for (i = 0; i < num; i++)
+ av_free(components[i]);
+ av_free(components);
+ return ret;
+}
+#endif /* !CONFIG_OMX_IMG */
+
+static OMX_ERRORTYPE omx_event_handler(OMX_HANDLETYPE component,
+ OMX_PTR app_data, OMX_EVENTTYPE event,
+ OMX_U32 data1, OMX_U32 data2,
+ OMX_PTR event_data)
+{
+ OMXCodecContext *ctx = app_data;
+
+ /* This uses casts in the printfs, since OMX_U32 actually is a typedef for
+ unsigned long in official header versions (but there are also modified
+ versions where it is something else). */
+ switch (event) {
+ case OMX_EventError:
+ pthread_mutex_lock(&ctx->state_mutex);
+ av_log(ctx->avctx, AV_LOG_ERROR, "OMX error %"PRIx32"\n",
+ (uint32_t) data1);
+ ctx->error = data1;
+ pthread_cond_broadcast(&ctx->state_cond);
+ pthread_mutex_unlock(&ctx->state_mutex);
+ break;
+ case OMX_EventCmdComplete:
+ if (data1 == OMX_CommandStateSet) {
+ pthread_mutex_lock(&ctx->state_mutex);
+ ctx->state = data2;
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "OMX state changed to %"PRIu32"\n", (uint32_t) data2);
+ pthread_cond_broadcast(&ctx->state_cond);
+ pthread_mutex_unlock(&ctx->state_mutex);
+ } else if (data1 == OMX_CommandPortDisable) {
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "OMX port %"PRIu32" disabled\n", (uint32_t) data2);
+ pthread_mutex_lock(&ctx->state_mutex);
+ pthread_cond_broadcast(&ctx->state_cond);
+ pthread_mutex_unlock(&ctx->state_mutex);
+ } else if (data1 == OMX_CommandPortEnable) {
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "OMX port %"PRIu32" enabled\n", (uint32_t) data2);
+ pthread_mutex_lock(&ctx->state_mutex);
+ pthread_cond_broadcast(&ctx->state_cond);
+ pthread_mutex_unlock(&ctx->state_mutex);
+ } else if (data1 == OMX_CommandFlush) {
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "OMX port %"PRIu32" flushed\n", (uint32_t) data2);
+ pthread_mutex_lock(&ctx->state_mutex);
+ ctx->flushing = 0;
+ pthread_cond_broadcast(&ctx->state_cond);
+ pthread_mutex_unlock(&ctx->state_mutex);
+ } else {
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "OMX command complete, command %"PRIu32", value %"PRIu32"\n",
+ (uint32_t) data1, (uint32_t) data2);
+ }
+ break;
+ case OMX_EventPortSettingsChanged:
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "OMX port %"PRIu32" settings changed\n", (uint32_t) data1);
+ /* Probably we are waiting for output data now. Wake up waiting task
+ to apply new output port settings. */
+ pthread_mutex_lock(&ctx->out_queue_mutex);
+ ctx->settings_changed = 1;
+ pthread_cond_broadcast(&ctx->out_queue_cond);
+ pthread_mutex_unlock(&ctx->out_queue_mutex);
+ break;
+ case OMX_EventBufferFlag:
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "OMX port %"PRIu32" EOS received (%"PRIx32")\n",
+ (uint32_t) data1, (uint32_t) data2);
+ break;
+ default:
+ av_log(ctx->avctx, AV_LOG_VERBOSE, "OMX event %d %"PRIx32" %"PRIx32"\n",
+ event, (uint32_t) data1, (uint32_t) data2);
+ break;
+ }
+ return OMX_ErrorNone;
+}
+
+/* Must be called with pool locked */
+static void omx_buffer_release(OMXBufferHeader *h)
+{
+ OMXCodecPort *port = h->port;
+ OMXCodecContext *ctx = h->port->ctx;
+
+ if (h->decoding) {
+ h->decoding = 0;
+ if (port->port_def.eDir == OMX_DirInput) {
+ OMXInputBuffer *buffer = h->priv;
+
+ h->header->pBuffer = NULL;
+ av_buffer_unref(&buffer->ref);
+ av_free(buffer);
+ }
+ h->next = port->headers;
+ port->headers = h;
+ atomic_fetch_add(&port->num_headers, 1);
+ }
+ else
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "Port %d release unused buffer %p - ignore\n", port->index, h);
+}
+
+static OMX_ERRORTYPE omx_empty_buffer_done(OMX_HANDLETYPE component,
+ OMX_PTR app_data,
+ OMX_BUFFERHEADERTYPE *header)
+{
+ OMXBufferHeader *h = header->pAppPrivate;
+ OMXCodecPort *port = h->port;
+
+ pthread_mutex_lock(&port->mutex);
+ omx_buffer_release(h);
+ pthread_mutex_unlock(&port->mutex);
+ /* Probably we are waiting for output data now, but decoder has not enough
+ input data yet. Wake up waiting task to send new data to the decoder. */
+ pthread_mutex_lock(&port->ctx->out_queue_mutex);
+ pthread_cond_broadcast(&port->ctx->out_queue_cond);
+ pthread_mutex_unlock(&port->ctx->out_queue_mutex);
+
+ return OMX_ErrorNone;
+}
+
+static OMX_ERRORTYPE omx_fill_buffer_done(OMX_HANDLETYPE component,
+ OMX_PTR app_data,
+ OMX_BUFFERHEADERTYPE *header)
+{
+ OMXCodecContext *ctx = app_data;
+ OMXBufferHeader *h = header->pAppPrivate;
+ OMXCodecPort *port = h->port;
+
+ pthread_mutex_lock(&port->mutex);
+ if (h->decoding) {
+ h->decoding = 0;
+ // add buffer to output queue
+ pthread_mutex_lock(&ctx->out_queue_mutex);
+ h->next = NULL;
+ if (!ctx->out_queue_head)
+ ctx->out_queue_head = h;
+ if (ctx->out_queue_tail)
+ ctx->out_queue_tail->next = h;
+ ctx->out_queue_tail = h;
+ ctx->out_queue_size++;
+ pthread_cond_broadcast(&ctx->out_queue_cond);
+ pthread_mutex_unlock(&ctx->out_queue_mutex);
+ }
+ else
+ av_log(ctx->avctx, AV_LOG_VERBOSE,
+ "Fill buffer done called for unused buffer\n");
+ pthread_mutex_unlock(&port->mutex);
+
+ return OMX_ErrorNone;
+}
+
+static const OMX_CALLBACKTYPE omx_callbacks = {
+ omx_event_handler,
+ omx_empty_buffer_done,
+ omx_fill_buffer_done
+};
+
+static enum AVPixelFormat omx_to_av_pix_fmt(OMX_COLOR_FORMATTYPE color_format)
+{
+ switch (color_format) {
+ case OMX_COLOR_FormatL8:
+ return AV_PIX_FMT_GRAY8;
+ case OMX_COLOR_FormatYUV420Planar:
+ case OMX_COLOR_FormatYUV420PackedPlanar:
+ return AV_PIX_FMT_YUV420P;
+ case OMX_COLOR_FormatYUV420SemiPlanar:
+ case OMX_COLOR_FormatYUV420PackedSemiPlanar:
+ return AV_PIX_FMT_NV12;
+ case OMX_COLOR_FormatYUV422SemiPlanar:
+ return AV_PIX_FMT_NV16;
+ case OMX_COLOR_FormatYCbYCr:
+ return AV_PIX_FMT_YUYV422;
+ case OMX_COLOR_FormatYCrYCb:
+ return AV_PIX_FMT_YVYU422;
+ case OMX_COLOR_FormatCbYCrY:
+ return AV_PIX_FMT_UYVY422;
+ case OMX_COLOR_Format32bitARGB8888:
+ /* There is a mismatch in omxil specification 4.2.1 between
+ OMX_COLOR_Format32bitARGB8888 and its description
+ Follow the description */
+ return AV_PIX_FMT_ABGR;
+ case OMX_COLOR_Format32bitBGRA8888:
+ /* Same issue as OMX_COLOR_Format32bitARGB8888 */
+ return AV_PIX_FMT_ARGB;
+ case OMX_COLOR_Format16bitRGB565:
+ return AV_PIX_FMT_RGB565;
+ case OMX_COLOR_Format16bitBGR565:
+ return AV_PIX_FMT_BGR565;
+ }
+
+ return AV_PIX_FMT_NONE;
+}
+
+static OMX_COLOR_FORMATTYPE omx_codec_select_color_format(OMXCodecContext *ctx)
+{
+ AVCodecContext *avctx = ctx->avctx;
+ OMX_COLOR_FORMATTYPE color_format = OMX_COLOR_FormatUnused;
+
+ if (avctx->pix_fmt != AV_PIX_FMT_NONE) {
+ OMX_VIDEO_PARAM_PORTFORMATTYPE video_port_format = { 0 };
+ OMX_ERRORTYPE err;
+ int i;
+
+ for (i = 0; ; i++) {
+ OMX_INIT_STRUCT(&video_port_format);
+ video_port_format.nIndex = i;
+ video_port_format.nPortIndex = ctx->out.index;
+ if (OMX_GetParameter(ctx->handle, OMX_IndexParamVideoPortFormat,
+ &video_port_format) != OMX_ErrorNone)
+ break;
+ if (omx_to_av_pix_fmt(video_port_format.eColorFormat) ==
+ avctx->pix_fmt) {
+ color_format = video_port_format.eColorFormat;
+ break;
+ }
+ }
+ if (color_format != OMX_COLOR_FormatUnused) {
+ OMX_INIT_STRUCT(&video_port_format);
+ video_port_format.nPortIndex = ctx->out.index;
+ video_port_format.eColorFormat = color_format;
+ err = OMX_SetParameter(ctx->handle, OMX_IndexParamVideoPortFormat,
+ &video_port_format);
+ if (err != OMX_ErrorNone)
+ av_log(avctx, AV_LOG_WARNING,
+ "Can not set port %d color format: %s\n",
+ ctx->out.index, omx_error_string(err));
+ }
+ }
+ return color_format;
+}
+
+static av_cold void omx_port_init(OMXCodecContext *ctx, OMXCodecPort *port)
+{
+ port->index = -1;
+ pthread_mutex_init(&port->mutex, NULL);
+ port->ctx = ctx;
+}
+
+static OMX_ERRORTYPE omx_update_port_definition(OMXCodecPort *port,
+ OMX_PARAM_PORTDEFINITIONTYPE *port_def)
+{
+ OMXCodecContext *ctx = port->ctx;
+ OMX_ERRORTYPE err;
+
+ if (port_def) {
+ err = OMX_SetParameter(ctx->handle, OMX_IndexParamPortDefinition,
+ port_def);
+ if (err != OMX_ErrorNone)
+ av_log(ctx->avctx, AV_LOG_WARNING,
+ "Can not set port %d definition: %s\n", port->index,
+ omx_error_string(err));
+ }
+ OMX_GetParameter(ctx->handle, OMX_IndexParamPortDefinition,
+ &port->port_def);
+
+ return err;
+}
+
+static av_cold OMX_VIDEO_CODINGTYPE omx_id_to_coding_type(enum AVCodecID id)
+{
+ switch (id) {
+ case AV_CODEC_ID_H264:
+ return OMX_VIDEO_CodingAVC;
+ case AV_CODEC_ID_HEVC:
+ return OMX_VIDEO_CodingHEVC;
+ case AV_CODEC_ID_MPEG4:
+ return OMX_VIDEO_CodingMPEG4;
+ case AV_CODEC_ID_H263:
+ return OMX_VIDEO_CodingH263;
+ case AV_CODEC_ID_MPEG2VIDEO:
+ return OMX_VIDEO_CodingMPEG2;
+ case AV_CODEC_ID_MJPEG:
+ return OMX_VIDEO_CodingMJPEG;
+ case AV_CODEC_ID_VP8:
+ return OMX_VIDEO_CodingVP8;
+ case AV_CODEC_ID_WMV3:
+ return OMX_VIDEO_CodingWMV;
+ case AV_CODEC_ID_RV30:
+ case AV_CODEC_ID_RV40:
+ return OMX_VIDEO_CodingRV;
+#if CONFIG_OMX_IMG
+ case AV_CODEC_ID_VC1:
+ return OMX_VIDEO_CodingVC1;
+ case AV_CODEC_ID_FLV1:
+ return OMX_VIDEO_CodingSorensonSpark;
+ case AV_CODEC_ID_VP6:
+ case AV_CODEC_ID_VP6F:
+ case AV_CODEC_ID_VP6A:
+ return OMX_VIDEO_CodingVP6;
+ case AV_CODEC_ID_AVS:
+ return OMX_VIDEO_CodingAVS;
+#endif /* CONFIG_OMX_IMG */
+ }
+ return OMX_VIDEO_CodingUnused;
+}
+
+static void omx_codec_set_output_format(OMXCodecContext *ctx)
+{
+ AVCodecContext *avctx = ctx->avctx;
+
+#if CONFIG_OMX_IMG
+ if (avctx->pix_fmt == AV_PIX_FMT_NONE)
+ avctx->pix_fmt = AV_PIX_FMT_YUV420P;
+
+ ctx->decoder_pix_fmt =
+ omx_to_av_pix_fmt(ctx->out.port_def.format.video.eColorFormat);
+ if (ctx->decoder_pix_fmt != AV_PIX_FMT_NONE) {
+ if (ctx->decoder_pix_fmt != avctx->pix_fmt) {
+ /* prepare pixel formats converter, if decoder and requested
+ output formats are not the same */
+ ctx->sws_ctx = sws_getCachedContext(ctx->sws_ctx,
+ avctx->width, avctx->height, ctx->decoder_pix_fmt,
+ avctx->width, avctx->height, avctx->pix_fmt,
+ 0, NULL, NULL, NULL);
+ if (!ctx->sws_ctx)
+ av_log(avctx, AV_LOG_ERROR,
+ "Can not create pixel formats converter\n");
+ }
+ }
+#else
+ avctx->pix_fmt =
+ omx_to_av_pix_fmt(ctx->out.port_def.format.video.eColorFormat);
+#endif /* CONFIG_OMX_IMG */
+}
+
+static av_cold int omx_port_config(OMXCodecPort *port)
+{
+ OMXCodecContext *ctx = port->ctx;
+ AVCodecContext *avctx = ctx->avctx;
+
+ port->port_def.bEnabled = OMX_TRUE;
+ port->port_def.bPopulated = OMX_FALSE;
+ port->port_def.eDomain = OMX_PortDomainVideo;
+ port->port_def.format.video.pNativeRender = NULL;
+ port->port_def.format.video.bFlagErrorConcealment = OMX_FALSE;
+ port->port_def.format.video.nFrameWidth = avctx->width;
+ port->port_def.format.video.nFrameHeight = avctx->height;
+ if (avctx->framerate.den > 0 && avctx->framerate.num > 0)
+ port->port_def.format.video.xFramerate =
+ (1LL << 16) * avctx->framerate.num / avctx->framerate.den;
+ else if (avctx->pkt_timebase.den > 0 && avctx->pkt_timebase.num > 0)
+ port->port_def.format.video.xFramerate =
+ (1LL << 16) * avctx->pkt_timebase.den / avctx->pkt_timebase.num;
+ else
+ port->port_def.format.video.xFramerate = 0;
+
+ if (port->port_def.eDir == OMX_DirInput) {
+ port->port_def.format.video.nStride = 0;
+ port->port_def.format.video.nSliceHeight = 0;
+ port->port_def.format.video.eCompressionFormat =
+ omx_id_to_coding_type(avctx->codec_id);
+ }
+ else {
+ port->port_def.format.video.nStride = ctx->stride;
+ port->port_def.format.video.nSliceHeight = ctx->plane_size;
+ }
+
+ if (omx_update_port_definition(port, &port->port_def) != OMX_ErrorNone)
+ return -1;
+ port->num_buffers = port->port_def.nBufferCountActual;
+ if (port->port_def.eDir == OMX_DirOutput) {
+ ctx->stride = port->port_def.format.video.nStride;
+ ctx->plane_size = port->port_def.format.video.nSliceHeight;
+ omx_codec_set_output_format(ctx);
+ }
+
+ return 0;
+}
+
+static av_cold int omx_component_init(OMXCodecContext *ctx, const char *role)
+{
+ AVCodecContext *avctx = ctx->avctx;
+ OMX_PARAM_COMPONENTROLETYPE role_params = { 0 };
+ OMX_PORT_PARAM_TYPE video_port_params = { 0 };
+ OMX_ERRORTYPE err;
+ int i;
+
+ err = ctx->core->pGetHandle(&ctx->handle, ctx->component_name, ctx,
+ (OMX_CALLBACKTYPE*) &omx_callbacks);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "Can not get component handle: %s\n",
+ omx_error_string(err));
+ return -1;
+ }
+
+ OMX_INIT_STRUCT(&role_params);
+ av_strlcpy(role_params.cRole, role, sizeof(role_params.cRole));
+ OMX_SetParameter(ctx->handle, OMX_IndexParamStandardComponentRole,
+ &role_params);
+
+ OMX_INIT_STRUCT(&video_port_params);
+ err = OMX_GetParameter(ctx->handle, OMX_IndexParamVideoInit,
+ &video_port_params);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "Can not get component ports: %s\n",
+ omx_error_string(err));
+ return -1;
+ }
+
+ for (i = 0; i < video_port_params.nPorts; i++) {
+ int port = video_port_params.nStartPortNumber + i;
+ OMX_PARAM_PORTDEFINITIONTYPE port_def = { 0 };
+
+ OMX_INIT_STRUCT(&port_def);
+ port_def.nPortIndex = port;
+ err = OMX_GetParameter(ctx->handle, OMX_IndexParamPortDefinition,
+ &port_def);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_WARNING,
+ "Can not get port %d definition: %s\n", port,
+ omx_error_string(err));
+ continue;
+ }
+ if (port_def.eDir == OMX_DirInput && ctx->in.index < 0) {
+ ctx->in.index = port;
+ ctx->in.port_def = port_def;
+ } else if (port_def.eDir == OMX_DirOutput && ctx->out.index < 0) {
+ ctx->out.index = port;
+ ctx->out.port_def = port_def;
+ }
+ }
+ if (ctx->in.index < 0 || ctx->out.index < 0) {
+ av_log(avctx, AV_LOG_ERROR, "No in or out port found (in %d out %d)\n",
+ ctx->in.index, ctx->out.index);
+ return -1;
+ }
+
+ // try to set output port default color format to avctx->pix_fmt
+ omx_codec_select_color_format(ctx);
+
+#if CONFIG_OMX_IMG
+ /* The following piece of code is to pass the information to OMX AVC or
+ HEVC component that the CodecConfig data and Picture Data is NAL Size
+ Delimited and will not contain NAL start codes(SCP- 0x00000001) */
+ if (avctx->codec_id == AV_CODEC_ID_H264 ||
+ avctx->codec_id == AV_CODEC_ID_HEVC) {
+ OMX_SetConfig(ctx->handle, OMX_IndexImgDataIsNALSizeDelimited,
+ NULL);
+ }
+#endif /* CONFIG_OMX_IMG */
+
+ if (omx_port_config(&ctx->in) < 0)
+ return -1;
+ if (omx_port_config(&ctx->out) < 0)
+ return -1;
+
+ return 0;
+}
+
+static int omx_port_buffers_alloc(OMXCodecPort *port)
+{
+ OMXCodecContext *ctx = port->ctx;
+ AVCodecContext *avctx = ctx->avctx;
+ int i, err = OMX_ErrorNone;
+
+ for (i = 0; i < port->num_buffers && err == OMX_ErrorNone; i++) {
+ OMXBufferHeader *h;
+
+ h = av_mallocz(sizeof(*h));
+ if (!h) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Port %d buffer allocation error: Not enough memory\n",
+ port->index);
+ return -1;
+ }
+ if (port->port_def.eDir == OMX_DirInput) {
+#if CONFIG_OMX_IMG
+ /* hack: IMG implementation of OMX_UseBuffer returns error
+ if pBuffer is NULL */
+ err = OMX_UseBuffer(ctx->handle, &h->header, port->index,
+ h, port->port_def.nBufferSize, (OMX_U8 *) 1);
+ if (h->header)
+ h->header->pBuffer = NULL;
+#else
+ err = OMX_UseBuffer(ctx->handle, &h->header, port->index,
+ h, port->port_def.nBufferSize, NULL);
+#endif /* CONFIG_OMX_IMG */
+ }
+ else
+ err = OMX_AllocateBuffer(ctx->handle, &h->header, port->index,
+ h, port->port_def.nBufferSize);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "Port %d buffer allocation error: %s\n",
+ port->index, omx_error_string(err));
+ av_free(h);
+ return -1;
+ }
+ h->port = port;
+ h->next = port->headers;
+ port->headers = h;
+ atomic_fetch_add(&port->num_headers, 1);
+ }
+
+ return 0;
+}
+
+static av_cold int omx_wait_for_state(OMXCodecContext *ctx, OMX_STATETYPE state)
+{
+ struct timespec ts;
+ int ret = 0;
+
+ pthread_mutex_lock(&ctx->state_mutex);
+ ctx->error = OMX_ErrorNone;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ ts.tv_sec += OMX_STATE_TIMEOUT;
+ while (ctx->state != state && ctx->error == OMX_ErrorNone && ret == 0)
+ ret = pthread_cond_timedwait(&ctx->state_cond, &ctx->state_mutex, &ts);
+ if (ctx->error != OMX_ErrorNone || ret != 0)
+ ret = -1;
+ pthread_mutex_unlock(&ctx->state_mutex);
+ return ret;
+}
+
+static av_cold const char *omx_id_to_role(enum AVCodecID id)
+{
+ switch (id) {
+ case AV_CODEC_ID_H264:
+ return OMX_ROLE_VIDEO_DECODER_AVC;
+ case AV_CODEC_ID_HEVC:
+ return OMX_ROLE_VIDEO_DECODER_HEVC;
+ case AV_CODEC_ID_MPEG4:
+ return OMX_ROLE_VIDEO_DECODER_MPEG4;
+ case AV_CODEC_ID_H263:
+ return OMX_ROLE_VIDEO_DECODER_H263;
+ case AV_CODEC_ID_MPEG2VIDEO:
+ return OMX_ROLE_VIDEO_DECODER_MPEG2;
+ case AV_CODEC_ID_MJPEG:
+ return "video_decoder.mjpeg";
+ case AV_CODEC_ID_VP8:
+ return OMX_ROLE_VIDEO_DECODER_VP8;
+ case AV_CODEC_ID_WMV3:
+ return OMX_ROLE_VIDEO_DECODER_WMV;
+ case AV_CODEC_ID_RV30:
+ case AV_CODEC_ID_RV40:
+ return OMX_ROLE_VIDEO_DECODER_RV;
+#if CONFIG_OMX_IMG
+ case AV_CODEC_ID_VC1:
+ return OMX_ROLE_VIDEO_DECODER_VC1;
+ case AV_CODEC_ID_FLV1:
+ return OMX_ROLE_VIDEO_DECODER_SORENSON;
+ case AV_CODEC_ID_VP6:
+ case AV_CODEC_ID_VP6F:
+ case AV_CODEC_ID_VP6A:
+ return OMX_ROLE_VIDEO_DECODER_VP6;
+ case AV_CODEC_ID_AVS:
+ return "video_decoder.avs";
+#endif /* CONFIG_OMX_IMG */
+ }
+ return NULL;
+}
+
+static av_cold int omx_decode_init(AVCodecContext *avctx)
+{
+ OMXCodecContext *ctx = avctx->priv_data;
+ const char *role;
+ OMX_ERRORTYPE err;
+
+ role = omx_id_to_role(avctx->codec_id);
+ if (!role) {
+ av_log(avctx, AV_LOG_ERROR, "Unsupported codec id %d\n",
+ avctx->codec_id);
+ return AVERROR_DECODER_NOT_FOUND;
+ }
+
+ ctx->core = omx_core_init(avctx, ctx->libname);
+ if (!ctx->core)
+ return AVERROR_DECODER_NOT_FOUND;
+
+ ctx->avctx = avctx;
+
+ omx_port_init(ctx, &ctx->in);
+ omx_port_init(ctx, &ctx->out);
+ pthread_mutex_init(&ctx->out_queue_mutex, NULL);
+ pthread_cond_init(&ctx->out_queue_cond, NULL);
+
+ pthread_mutex_init(&ctx->state_mutex, NULL);
+ pthread_cond_init(&ctx->state_cond, NULL);
+
+ ctx->state = OMX_StateLoaded;
+ ctx->error = OMX_ErrorNone;
+
+#if CONFIG_OMX_IMG
+ err = ctx->core->pComponentOfRoleEnum((OMX_STRING) ctx->component_name,
+ (OMX_STRING) role, 0);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "No component for role %s found: %s\n",
+ role, omx_error_string(err));
+ return AVERROR_DECODER_NOT_FOUND;
+ }
+#else
+ if (omx_component_find(ctx, role,
+ ctx->component_name,
+ sizeof(ctx->component_name)) < 0)
+ return AVERROR_DECODER_NOT_FOUND;
+#endif /* CONFIG_OMX_IMG */
+
+ av_log(avctx, AV_LOG_INFO, "Using %s\n", ctx->component_name);
+
+ if (omx_component_init(ctx, role) < 0)
+ return AVERROR_DECODER_NOT_FOUND;
+
+ err = OMX_SendCommand(ctx->handle, OMX_CommandStateSet, OMX_StateIdle,
+ NULL);
+ if (err != OMX_ErrorNone) {
+ av_log(ctx->avctx, AV_LOG_ERROR, "Set StateIdle error: %s\n",
+ omx_error_string(err));
+ return AVERROR_UNKNOWN;
+ }
+ if (omx_port_buffers_alloc(&ctx->in) < 0)
+ return AVERROR_UNKNOWN;
+ if (omx_port_buffers_alloc(&ctx->out) < 0)
+ return AVERROR_UNKNOWN;
+ if (omx_wait_for_state(ctx, OMX_StateIdle) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Did not get StateIdle\n");
+ return AVERROR_UNKNOWN;
+ }
+ err = OMX_SendCommand(ctx->handle, OMX_CommandStateSet, OMX_StateExecuting,
+ NULL);
+ if (err != OMX_ErrorNone) {
+ av_log(ctx->avctx, AV_LOG_ERROR, "Set StateExecuting error: %s\n",
+ omx_error_string(err));
+ return AVERROR_UNKNOWN;
+ }
+ if (omx_wait_for_state(ctx, OMX_StateExecuting) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Did not get StateExecuting\n");
+ return AVERROR_UNKNOWN;
+ }
+
+ return 0;
+}
+
+static inline int64_t from_pts(AVRational timebase, int64_t value)
+{
+ if (value != AV_NOPTS_VALUE) {
+ if (timebase.num > 0 && timebase.den > 0)
+ return av_rescale_q(value, timebase, AV_TIME_BASE_Q);
+ else
+ return value;
+ }
+ return 0;
+}
+
+static inline int64_t to_pts(AVRational timebase, int64_t value)
+{
+ if (timebase.num > 0 && timebase.den > 0)
+ return av_rescale_q(value, AV_TIME_BASE_Q, timebase);
+ return value;
+}
+
+static int omx_add_packet(OMXCodecContext *ctx, AVPacket *avpkt,
+ int is_extradata)
+{
+ AVCodecContext *avctx = ctx->avctx;
+ AVBufferRef *buf = NULL;
+ int size = 0;
+ uint8_t *data = NULL;
+ int ret = 0;
+
+ if (avpkt->size) {
+ if (avpkt->buf) {
+ buf = av_buffer_ref(avpkt->buf);
+ size = avpkt->size;
+ data = avpkt->data;
+ } else {
+ buf = av_buffer_alloc(avpkt->size);
+ if (buf) {
+ memcpy(buf->data, avpkt->data, buf->size);
+ size = buf->size;
+ data = buf->data;
+ }
+ }
+ if (!buf) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Input queue add package error: Not enough memory\n");
+ ret = AVERROR(ENOMEM);
+ goto done;
+ }
+ }
+ else if (ctx->eos_sent)
+ goto done;
+
+ do {
+ OMXInputBuffer *buffer;
+
+ buffer = av_mallocz(sizeof(*buffer));
+ if (!buffer) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Input queue add package error: Not enough memory\n");
+ ret = AVERROR(ENOMEM);
+ goto done;
+ }
+
+ buffer->data = data;
+ buffer->size = FFMIN(size, ctx->in.port_def.nBufferSize);
+ buffer->pts = avpkt->pts;
+
+ if (is_extradata)
+ buffer->flags |= OMX_BUFFERFLAG_CODECCONFIG;
+
+ data += buffer->size;
+ size -= buffer->size;
+
+ if (!size)
+ buffer->flags |= OMX_BUFFERFLAG_ENDOFFRAME;
+
+ if (!buffer->size) {
+ buffer->flags |= OMX_BUFFERFLAG_EOS;
+ ctx->eos_sent = 1;
+ }
+
+ if (buf) {
+ buffer->ref = av_buffer_ref(buf);
+ if (!buffer->ref) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Input queue add package error: Not enough memory\n");
+ av_free(buffer);
+ ret = AVERROR(ENOMEM);
+ goto done;
+ }
+ }
+
+ // add buffer to input queue
+ if (!ctx->in_queue_head)
+ ctx->in_queue_head = buffer;
+ if (ctx->in_queue_tail)
+ ctx->in_queue_tail->next = buffer;
+ ctx->in_queue_tail = buffer;
+ ctx->in_queue_size++;
+ } while (size);
+
+done:
+ av_buffer_unref(&buf);
+ return ret;
+}
+
+static int omx_fill_output_port(OMXCodecContext *ctx)
+{
+ OMXCodecPort *port = &ctx->out;
+ OMXBufferHeader *h;
+ int ret = 0;
+
+ if (ctx->settings_changed)
+ return 0;
+
+ pthread_mutex_lock(&port->mutex);
+ while ((h = port->headers)) {
+ OMX_ERRORTYPE err;
+
+ // prepare buffer header
+ h->decoding = 1;
+ // remove buffer header from pool
+ port->headers = h->next;
+ atomic_fetch_add(&port->num_headers, -1);
+ /* deadlock could happens if FillThisBuffer called locked
+ when FillBufferDone is waiting for lock */
+ pthread_mutex_unlock(&port->mutex);
+ err = OMX_FillThisBuffer(ctx->handle, h->header);
+ pthread_mutex_lock(&port->mutex);
+ if (err != OMX_ErrorNone) {
+ omx_buffer_release(h);
+ ret = AVERROR_UNKNOWN;
+ av_log(ctx->avctx, AV_LOG_ERROR, "FillThisBuffer error: %s\n",
+ omx_error_string(err));
+ break;
+ }
+ }
+ pthread_mutex_unlock(&port->mutex);
+ return ret;
+}
+
+static int omx_fill_input_port(OMXCodecContext *ctx)
+{
+ AVCodecContext *avctx = ctx->avctx;
+ OMXCodecPort *port = &ctx->in;
+ OMXInputBuffer *buffer;
+
+ if (ctx->settings_changed)
+ return 0;
+
+ while ((buffer = ctx->in_queue_head)) {
+ OMXBufferHeader *h;
+ OMX_ERRORTYPE err;
+
+ pthread_mutex_lock(&port->mutex);
+ h = port->headers;
+ if (!h) {
+ pthread_mutex_unlock(&port->mutex);
+ return 0;
+ }
+ // prepare buffer header
+ h->priv = buffer;
+ h->header->pBuffer = buffer->data;
+ h->header->nOffset = 0;
+ h->header->nFilledLen = buffer->size;
+ h->header->nTimeStamp = to_omx_ticks(from_pts(avctx->pkt_timebase,
+ buffer->pts));
+ h->header->nFlags = buffer->flags;
+ h->decoding = 1;
+ // remove buffer header from pool
+ port->headers = h->next;
+ atomic_fetch_add(&port->num_headers, -1);
+ // remove buffer from input queue
+ ctx->in_queue_head = buffer->next;
+ if (ctx->in_queue_tail == buffer)
+ ctx->in_queue_tail = NULL;
+ ctx->in_queue_size--;
+ /* deadlock could happens if EmptyThisBuffer called locked
+ when EmptyBufferDone is waiting for lock */
+ pthread_mutex_unlock(&port->mutex);
+ err = OMX_EmptyThisBuffer(ctx->handle, h->header);
+ if (err != OMX_ErrorNone) {
+ pthread_mutex_lock(&port->mutex);
+ omx_buffer_release(h);
+ pthread_mutex_unlock(&port->mutex);
+ av_log(avctx, AV_LOG_ERROR, "EmptyThisBuffer error: %s\n",
+ omx_error_string(err));
+ return AVERROR_UNKNOWN;
+ }
+ }
+ return 0;
+}
+
+static OMXBufferHeader *omx_get_output(OMXCodecContext *ctx, int wait)
+{
+ OMXBufferHeader *h = NULL;
+ int ret = 0;
+
+ pthread_mutex_lock(&ctx->out_queue_mutex);
+ if (wait) {
+ struct timespec ts;
+
+ clock_gettime(CLOCK_REALTIME, &ts);
+ ts.tv_sec += OMX_OUTPUT_TIMEOUT;
+ /* Waiting until output buffer available or output port settings changed
+ or input port buffer available or timeout occured */
+ while (!ctx->out_queue_head && !ctx->settings_changed &&
+ atomic_load(&ctx->in.num_headers) == 0 && ret == 0)
+ ret = pthread_cond_timedwait(&ctx->out_queue_cond,
+ &ctx->out_queue_mutex, &ts);
+ }
+ if (ret == 0 && !ctx->settings_changed && (h = ctx->out_queue_head)) {
+ ctx->out_queue_head = h->next;
+ if (ctx->out_queue_tail == h)
+ ctx->out_queue_tail = NULL;
+ ctx->out_queue_size--;
+ }
+ pthread_mutex_unlock(&ctx->out_queue_mutex);
+
+ return h;
+}
+
+static int omx_read_frame(OMXCodecContext *ctx, AVFrame *frame, int *got_frame)
+{
+ AVCodecContext *avctx = ctx->avctx;
+ OMXCodecPort *port = &ctx->out;
+ int ret = 0;
+
+ while (!*got_frame && ret == 0 && !ctx->eos_received) {
+ OMXBufferHeader *h;
+ int wait = ctx->eos_sent ||
+ ctx->in_queue_size >= OMX_INPUT_QUEUE_THRESHOLD;
+ int eof;
+
+ // if flushing or input queue exceeded, try blocking wait
+ h = omx_get_output(ctx, wait);
+ if (!h) {
+ if (wait && !ctx->settings_changed &&
+ atomic_load(&ctx->in.num_headers) == 0) {
+ av_log(avctx, AV_LOG_VERBOSE, "Output data timeout\n");
+ ret = AVERROR_UNKNOWN;
+ }
+ break;
+ }
+
+#if CONFIG_OMX_IMG
+ eof = 1;
+#else
+ eof = h->header->nFlags & OMX_BUFFERFLAG_ENDOFFRAME;
+#endif /* CONFIG_OMX_IMG */
+
+ if (h->header->nFlags & OMX_BUFFERFLAG_EOS) {
+ ctx->eos_received = 1;
+ }
+
+#if !CONFIG_OMX_IMG
+ if (h->header->nFilledLen > 0 && (ctx->output_buf || !eof)) {
+ if ((ret = av_reallocp(&ctx->output_buf,
+ ctx->output_buf_size +
+ h->header->nFilledLen)) < 0) {
+ ctx->output_buf_size = 0;
+ av_log(avctx, AV_LOG_ERROR,
+ "Output buffer allocation error: %d\n", ret);
+ goto end;
+ }
+ memcpy(ctx->output_buf + ctx->output_buf_size,
+ h->header->pBuffer + h->header->nOffset,
+ h->header->nFilledLen);
+ ctx->output_buf_size += h->header->nFilledLen;
+ }
+#endif /* !CONFIG_OMX_IMG */
+
+ if (eof) {
+ uint8_t *buf = NULL;
+ int len = 0;
+ uint8_t *src[4];
+ int linesize[4];
+
+#if !CONFIG_OMX_IMG
+ if (ctx->output_buf) {
+ buf = ctx->output_buf;
+ len = ctx->output_buf_size;
+ }
+ else
+#endif /* !CONFIG_OMX_IMG */
+ if (h->header->nFilledLen > 0) {
+ buf = h->header->pBuffer + h->header->nOffset;
+ len = h->header->nFilledLen;
+ }
+
+ if (!buf || len == 0) {
+ goto end;
+ }
+
+ if ((ret = ff_get_buffer(avctx, frame, 0)) == 0) {
+ av_image_fill_arrays(src, linesize, buf,
+#if CONFIG_OMX_IMG
+ ctx->decoder_pix_fmt,
+#else
+ avctx->pix_fmt,
+#endif /* CONFIG_OMX_IMG */
+ ctx->stride, ctx->plane_size, 1);
+#if CONFIG_OMX_IMG
+ if (ctx->sws_ctx)
+ sws_scale(ctx->sws_ctx, (const uint8_t **) src, linesize,
+ 0, avctx->height, frame->data, frame->linesize);
+ else
+#endif /* CONFIG_OMX_IMG */
+ av_image_copy(frame->data, frame->linesize,
+ (const uint8_t **) src, linesize,
+ avctx->pix_fmt, avctx->width, avctx->height);
+
+ frame->pts = to_pts(avctx->pkt_timebase,
+ from_omx_ticks(h->header->nTimeStamp));
+#if FF_API_PKT_PTS
+FF_DISABLE_DEPRECATION_WARNINGS
+ frame->pkt_pts = frame->pts;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+ frame->pkt_dts = AV_NOPTS_VALUE;
+
+ *got_frame = 1;
+ }
+ else
+ av_log(avctx, AV_LOG_ERROR,
+ "Frame buffer allocation error: %d\n", ret);
+#if !CONFIG_OMX_IMG
+ av_freep(&ctx->output_buf);
+ ctx->output_buf_size = 0;
+#endif /* !CONFIG_OMX_IMG */
+ }
+end:
+ pthread_mutex_lock(&port->mutex);
+ h->next = port->headers;
+ port->headers = h;
+ atomic_fetch_add(&port->num_headers, 1);
+ pthread_mutex_unlock(&port->mutex);
+ }
+
+ return ret;
+}
+
+static void omx_port_free(OMXCodecPort *port)
+{
+ OMXBufferHeader *h;
+
+ while ((h = port->headers)) {
+ port->headers = h->next;
+ atomic_fetch_add(&port->num_headers, -1);
+ port->num_buffers--;
+ OMX_FreeBuffer(port->ctx->handle, port->index, h->header);
+ av_free(h);
+ }
+}
+
+static av_cold int omx_wait_port_state(OMXCodecPort *port, int enabled)
+{
+ OMXCodecContext *ctx = port->ctx;
+ struct timespec ts;
+ int ret = 0;
+
+ pthread_mutex_lock(&ctx->state_mutex);
+ ctx->error = OMX_ErrorNone;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ ts.tv_sec += OMX_STATE_TIMEOUT;
+ omx_update_port_definition(port, NULL);
+ while (!!port->port_def.bEnabled != !!enabled &&
+ ctx->error == OMX_ErrorNone && ret == 0) {
+ ret = pthread_cond_timedwait(&ctx->state_cond, &ctx->state_mutex, &ts);
+ omx_update_port_definition(port, NULL);
+ }
+ if (ctx->error != OMX_ErrorNone || ret != 0)
+ ret = -1;
+ pthread_mutex_unlock(&ctx->state_mutex);
+ return ret;
+}
+
+static int omx_change_settings(OMXCodecContext *ctx)
+{
+ AVCodecContext *avctx = ctx->avctx;
+ OMXCodecPort *port = &ctx->out;
+ int width, height;
+#if CONFIG_OMX_IMG
+ OMX_CONFIG_RECTTYPE crop_rect;
+#endif /* CONFIG_OMX_IMG */
+ OMX_ERRORTYPE err;
+
+ /* For decoder we dealing with output port settings only */
+
+ // disable port
+ omx_update_port_definition(port, NULL);
+ if (port->port_def.bEnabled) {
+ err = OMX_SendCommand(ctx->handle, OMX_CommandPortDisable, port->index,
+ NULL);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "Port %d disable error: %s\n",
+ port->index, omx_error_string(err));
+ return AVERROR_UNKNOWN;
+ }
+ }
+ // deallocate port buffers
+ pthread_mutex_lock(&port->mutex);
+ omx_port_free(port);
+ pthread_mutex_unlock(&port->mutex);
+ while (port->num_buffers > 0) {
+ OMXBufferHeader *h;
+
+ h = omx_get_output(ctx, 1);
+ if (!h) {
+ av_log(avctx, AV_LOG_VERBOSE, "Output data timeout\n");
+ break;
+ }
+ port->num_buffers--;
+ OMX_FreeBuffer(ctx->handle, port->index, h->header);
+ av_free(h);
+ }
+ // wait for port disabled
+ if (omx_wait_port_state(port, 0) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Port %d not disabled\n", port->index);
+ return AVERROR_UNKNOWN;
+ }
+ // update port config
+ omx_codec_select_color_format(ctx);
+ if (omx_update_port_definition(port, &port->port_def) != OMX_ErrorNone)
+ return AVERROR_UNKNOWN;
+ port->num_buffers = port->port_def.nBufferCountActual;
+ ctx->stride = port->port_def.format.video.nStride;
+ ctx->plane_size = port->port_def.format.video.nSliceHeight;
+ width = port->port_def.format.video.nFrameWidth;
+ height = port->port_def.format.video.nFrameHeight;
+#if CONFIG_OMX_IMG
+ OMX_INIT_STRUCT(&crop_rect);
+ err = OMX_GetConfig(ctx->handle, OMX_IndexConfigCommonOutputCrop,
+ &crop_rect);
+ if (err == OMX_ErrorNone) {
+ width = crop_rect.nWidth;
+ height = crop_rect.nHeight;
+ }
+ else
+ av_log(avctx, AV_LOG_WARNING,
+ "Can not get output port crop rectangle: %s\n",
+ omx_error_string(err));
+#endif /* CONFIG_OMX_IMG */
+ if (ff_set_dimensions(avctx, width, height) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Can not set frame dimensions\n");
+ return AVERROR_UNKNOWN;
+ }
+ omx_codec_set_output_format(ctx);
+ if (avctx->pix_fmt == AV_PIX_FMT_NONE) {
+ av_log(avctx, AV_LOG_ERROR, "Undefined output pixel format\n");
+ return -1;
+ }
+ // enable port
+ if (!port->port_def.bEnabled) {
+ err = OMX_SendCommand(ctx->handle, OMX_CommandPortEnable, port->index,
+ NULL);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "Port %d enable error: %s\n",
+ port->index, omx_error_string(err));
+ return AVERROR_UNKNOWN;
+ }
+ }
+ // allocate port buffers
+ if (omx_port_buffers_alloc(port) < 0)
+ return AVERROR_UNKNOWN;
+ // wait for port enabled
+ if (omx_wait_port_state(port, 1) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Port %d not enabled\n", port->index);
+ return AVERROR_UNKNOWN;
+ }
+ return 0;
+}
+
+static int omx_decode(AVCodecContext *avctx, void *data, int *got_frame,
+ AVPacket *avpkt)
+{
+ OMXCodecContext *ctx = avctx->priv_data;
+ AVFrame *frame = data;
+ int ret = 0;
+
+ if (avctx->extradata_size && !ctx->extradata_sent) {
+ AVPacket pkt = {0};
+
+ av_init_packet(&pkt);
+ pkt.data = avctx->extradata;
+ pkt.size = avctx->extradata_size;
+ ctx->extradata_sent = 1;
+ if ((ret = omx_add_packet(ctx, &pkt, 1)) < 0)
+ return ret;
+ }
+
+ if ((ret = omx_add_packet(ctx, avpkt, 0)) < 0)
+ return ret;
+
+ if ((ret = omx_fill_output_port(ctx)) < 0)
+ return ret;
+
+ if ((ret = omx_fill_input_port(ctx)) < 0)
+ return ret;
+
+ if ((ret = omx_read_frame(ctx, frame, got_frame)) < 0)
+ return ret;
+
+ if (ctx->settings_changed) {
+ ctx->settings_changed = 0;
+ if ((ret = omx_change_settings(ctx)) < 0)
+ return ret;
+ }
+
+ if ((ret = omx_fill_output_port(ctx)) < 0)
+ return ret;
+
+ if ((ret = omx_fill_input_port(ctx)) < 0)
+ return ret;
+
+ return 0;
+}
+
+static int omx_wait_flushed(OMXCodecContext *ctx)
+{
+ struct timespec ts;
+ int ret = 0;
+
+ pthread_mutex_lock(&ctx->state_mutex);
+ ctx->error = OMX_ErrorNone;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ ts.tv_sec += OMX_STATE_TIMEOUT;
+ while (ctx->flushing && ctx->error == OMX_ErrorNone && ret == 0) {
+ ret = pthread_cond_timedwait(&ctx->state_cond, &ctx->state_mutex, &ts);
+ }
+ if (ctx->error != OMX_ErrorNone || ret != 0)
+ ret = -1;
+ pthread_mutex_unlock(&ctx->state_mutex);
+ return ret;
+}
+
+static void omx_input_queue_free(OMXCodecContext *ctx)
+{
+ OMXInputBuffer *buffer;
+
+ while ((buffer = ctx->in_queue_head)) {
+ ctx->in_queue_head = buffer->next;
+ if (ctx->in_queue_tail == buffer)
+ ctx->in_queue_tail = NULL;
+ ctx->in_queue_size--;
+ av_buffer_unref(&buffer->ref);
+ av_free(buffer);
+ }
+}
+
+static void omx_flush(AVCodecContext *avctx)
+{
+ OMXCodecContext *ctx = avctx->priv_data;
+ OMXBufferHeader *h;
+ OMX_STATETYPE state;
+ OMX_ERRORTYPE err;
+
+ pthread_mutex_lock(&ctx->state_mutex);
+ state = ctx->state;
+ pthread_mutex_unlock(&ctx->state_mutex);
+
+ // pause component
+ if (state == OMX_StateExecuting) {
+ err = OMX_SendCommand(ctx->handle, OMX_CommandStateSet,
+ OMX_StatePause, NULL);
+ if (err != OMX_ErrorNone)
+ av_log(ctx->avctx, AV_LOG_ERROR, "Set StatePause error: %s\n",
+ omx_error_string(err));
+ }
+ // input queue free
+ omx_input_queue_free(ctx);
+ ctx->in_queue_head = ctx->in_queue_tail = NULL;
+ ctx->in_queue_size = 0;
+ // flush input port
+ ctx->flushing = 1;
+ err = OMX_SendCommand(ctx->handle, OMX_CommandFlush, ctx->in.index, NULL);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "Input port flush error: %s\n",
+ omx_error_string(err));
+ ctx->flushing = 0;
+ }
+ if (omx_wait_flushed(ctx) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Input port not flushed\n");
+ ctx->flushing = 0;
+ }
+ // flush output port
+ ctx->flushing = 1;
+ err = OMX_SendCommand(ctx->handle, OMX_CommandFlush, ctx->out.index, NULL);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "Output port flush error: %s\n",
+ omx_error_string(err));
+ ctx->flushing = 0;
+ }
+ if (omx_wait_flushed(ctx) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Output port not flushed\n");
+ ctx->flushing = 0;
+ }
+ // output queue free
+ pthread_mutex_lock(&ctx->out.mutex);
+ pthread_mutex_lock(&ctx->out_queue_mutex);
+ while ((h = ctx->out_queue_head)) {
+ ctx->out_queue_head = h->next;
+ if (ctx->out_queue_tail == h)
+ ctx->out_queue_tail = NULL;
+ ctx->out_queue_size--;
+ h->next = ctx->out.headers;
+ ctx->out.headers = h;
+ atomic_fetch_add(&ctx->out.num_headers, 1);
+ }
+ ctx->out_queue_head = ctx->out_queue_tail = NULL;
+ ctx->out_queue_size = 0;
+ pthread_mutex_unlock(&ctx->out_queue_mutex);
+ pthread_mutex_unlock(&ctx->out.mutex);
+ // resume component
+ err = OMX_SendCommand(ctx->handle, OMX_CommandStateSet, OMX_StateExecuting,
+ NULL);
+ if (err != OMX_ErrorNone)
+ av_log(ctx->avctx, AV_LOG_ERROR, "Set StateExecuting error: %s\n",
+ omx_error_string(err));
+ // reset EOS flag
+ ctx->eos_sent = ctx->eos_received = 0;
+ // fill output port
+ omx_fill_output_port(ctx);
+}
+
+static av_cold void omx_port_destroy(OMXCodecPort *port)
+{
+ pthread_mutex_destroy(&port->mutex);
+ port->num_buffers = 0;
+ atomic_store(&port->num_headers, 0);
+ port->headers = NULL;
+}
+
+static av_cold void omx_output_queue_free(OMXCodecContext *ctx)
+{
+ OMXBufferHeader *h;
+
+ while ((h = ctx->out_queue_head)) {
+ ctx->out_queue_head = h->next;
+ if (ctx->out_queue_tail == h)
+ ctx->out_queue_tail = NULL;
+ ctx->out_queue_size--;
+ ctx->out.num_buffers--;
+ OMX_FreeBuffer(ctx->handle, ctx->out.index, h->header);
+ av_free(h);
+ }
+}
+
+static av_cold void omx_decode_stop(OMXCodecContext *ctx)
+{
+ omx_port_free(&ctx->in);
+ omx_input_queue_free(ctx);
+ omx_port_free(&ctx->out);
+ omx_output_queue_free(ctx);
+}
+
+static av_cold int omx_decode_close(AVCodecContext *avctx)
+{
+ OMXCodecContext *ctx = avctx->priv_data;
+ OMX_STATETYPE state;
+
+ pthread_mutex_lock(&ctx->state_mutex);
+ state = ctx->state;
+ pthread_mutex_unlock(&ctx->state_mutex);
+
+ if (state > OMX_StateLoaded || state == OMX_StateInvalid) {
+ OMX_ERRORTYPE err;
+
+ if (state > OMX_StateIdle) {
+ err = OMX_SendCommand(ctx->handle, OMX_CommandStateSet,
+ OMX_StateIdle, NULL);
+ if (err != OMX_ErrorNone)
+ av_log(ctx->avctx, AV_LOG_ERROR, "Set StateIdle error: %s\n",
+ omx_error_string(err));
+ if (omx_wait_for_state(ctx, OMX_StateIdle) < 0)
+ av_log(avctx, AV_LOG_ERROR, "Did not get StateIdle\n");
+ }
+ err = OMX_SendCommand(ctx->handle, OMX_CommandStateSet, OMX_StateLoaded,
+ NULL);
+ if (err != OMX_ErrorNone)
+ av_log(ctx->avctx, AV_LOG_ERROR, "Set StateLoaded error: %s\n",
+ omx_error_string(err));
+ omx_decode_stop(ctx);
+ if (omx_wait_for_state(ctx, OMX_StateLoaded) < 0)
+ av_log(avctx, AV_LOG_ERROR, "Did not get StateLoaded\n");
+ }
+
+ if (ctx->handle) {
+ ctx->core->pFreeHandle(ctx->handle);
+ ctx->handle = NULL;
+ }
+
+ omx_core_destroy(ctx->core);
+ ctx->core = NULL;
+
+ pthread_cond_destroy(&ctx->state_cond);
+ pthread_mutex_destroy(&ctx->state_mutex);
+
+ ctx->in_queue_head = ctx->in_queue_tail = NULL;
+ ctx->in_queue_size = 0;
+
+ ctx->out_queue_head = ctx->out_queue_tail = NULL;
+ ctx->out_queue_size = 0;
+ pthread_cond_destroy(&ctx->out_queue_cond);
+ pthread_mutex_destroy(&ctx->out_queue_mutex);
+#if !CONFIG_OMX_IMG
+ av_freep(&ctx->output_buf);
+ ctx->output_buf_size = 0;
+#endif /* !CONFIG_OMX_IMG */
+ ctx->settings_changed = 0;
+#if CONFIG_OMX_IMG
+ sws_freeContext(ctx->sws_ctx);
+ ctx->sws_ctx = NULL;
+ ctx->decoder_pix_fmt = AV_PIX_FMT_NONE;
+#endif /* CONFIG_OMX_IMG */
+
+ omx_port_destroy(&ctx->in);
+ omx_port_destroy(&ctx->out);
+
+ ctx->eos_sent = ctx->eos_received = ctx->extradata_sent = 0;
+
+ return 0;
+}
+
+#define OFFSET(x) offsetof(OMXCodecContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
+static const AVOption options[] = {
+ { "omx_libname", "OpenMAX library name", OFFSET(libname),
+ AV_OPT_TYPE_STRING, { 0 }, 0, 0, FLAGS },
+ { NULL }
+};
+
+static const enum AVPixelFormat omx_decoder_pix_fmts[] = {
+ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE
+};
+
+#define OMXDEC_CLASS(NAME) \
+ static const AVClass omx_ ## NAME ## _dec_class = { \
+ .class_name = #NAME "_omx_decoder", \
+ .item_name = av_default_item_name, \
+ .option = options, \
+ .version = LIBAVUTIL_VERSION_INT, \
+ };
+
+#define OMXDEC(NAME, LONGNAME, ID) \
+ OMXDEC_CLASS(NAME) \
+ AVCodec ff_ ## NAME ## _omx_decoder = { \
+ .name = #NAME "_omx" , \
+ .long_name = NULL_IF_CONFIG_SMALL("OpenMAX " LONGNAME " decoder"),\
+ .type = AVMEDIA_TYPE_VIDEO, \
+ .id = ID , \
+ .priv_data_size = sizeof(OMXCodecContext), \
+ .init = omx_decode_init, \
+ .decode = omx_decode, \
+ .flush = omx_flush, \
+ .close = omx_decode_close, \
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, \
+ .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | \
+ FF_CODEC_CAP_INIT_CLEANUP, \
+ .pix_fmts = omx_decoder_pix_fmts, \
+ .wrapper_name = "omx", \
+ }
+
+OMXDEC(h264, "H.264", AV_CODEC_ID_H264);
+OMXDEC(hevc, "H.265", AV_CODEC_ID_HEVC);
+OMXDEC(mpeg4, "MPEG4", AV_CODEC_ID_MPEG4);
+OMXDEC(h263, "H.263", AV_CODEC_ID_H263);
+OMXDEC(mpeg2, "MPEG2", AV_CODEC_ID_MPEG2VIDEO);
+OMXDEC(mjpeg, "MJPEG", AV_CODEC_ID_MJPEG);
+OMXDEC(vp8, "VP8", AV_CODEC_ID_VP8);
+OMXDEC(wmv3, "WMV3", AV_CODEC_ID_WMV3);
+OMXDEC(rv30, "RealVideo 3.0", AV_CODEC_ID_RV30);
+OMXDEC(rv40, "RealVideo 4.0", AV_CODEC_ID_RV40);
+#if CONFIG_OMX_IMG
+OMXDEC(vc1, "VC1", AV_CODEC_ID_VC1);
+OMXDEC(sorenson, "Sorenson", AV_CODEC_ID_FLV1);
+OMXDEC(vp6, "VP6", AV_CODEC_ID_VP6);
+OMXDEC(vp6f, "VP6F", AV_CODEC_ID_VP6F);
+OMXDEC(vp6a, "VP6A", AV_CODEC_ID_VP6A);
+OMXDEC(avs, "AVS", AV_CODEC_ID_AVS);
+#endif /* CONFIG_OMX_IMG */
Index: omxenc.c
===================================================================
--- omxenc.c (nonexistent)
+++ omxenc.c (revision 377)
@@ -0,0 +1,988 @@
+/*
+ * OMX Video encoder
+ * Copyright (C) 2011 Martin Storsjo
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#if CONFIG_OMX_RPI
+#define OMX_SKIP64BIT
+#endif
+
+#include <dlfcn.h>
+#include <OMX_Core.h>
+#include <OMX_Component.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include "libavutil/avstring.h"
+#include "libavutil/avutil.h"
+#include "libavutil/common.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/log.h"
+#include "libavutil/opt.h"
+
+#include "avcodec.h"
+#include "h264.h"
+#include "internal.h"
+
+#ifdef OMX_SKIP64BIT
+static OMX_TICKS to_omx_ticks(int64_t value)
+{
+ OMX_TICKS s;
+ s.nLowPart = value & 0xffffffff;
+ s.nHighPart = value >> 32;
+ return s;
+}
+static int64_t from_omx_ticks(OMX_TICKS value)
+{
+ return (((int64_t)value.nHighPart) << 32) | value.nLowPart;
+}
+#else
+#define to_omx_ticks(x) (x)
+#define from_omx_ticks(x) (x)
+#endif
+
+#define INIT_STRUCT(x) do { \
+ x.nSize = sizeof(x); \
+ x.nVersion = s->version; \
+ } while (0)
+#define CHECK(x) do { \
+ if (x != OMX_ErrorNone) { \
+ av_log(avctx, AV_LOG_ERROR, \
+ "err %x (%d) on line %d\n", x, x, __LINE__); \
+ return AVERROR_UNKNOWN; \
+ } \
+ } while (0)
+
+typedef struct OMXContext {
+ void *lib;
+ void *lib2;
+ OMX_ERRORTYPE (*ptr_Init)(void);
+ OMX_ERRORTYPE (*ptr_Deinit)(void);
+ OMX_ERRORTYPE (*ptr_ComponentNameEnum)(OMX_STRING, OMX_U32, OMX_U32);
+ OMX_ERRORTYPE (*ptr_GetHandle)(OMX_HANDLETYPE*, OMX_STRING, OMX_PTR, OMX_CALLBACKTYPE*);
+ OMX_ERRORTYPE (*ptr_FreeHandle)(OMX_HANDLETYPE);
+ OMX_ERRORTYPE (*ptr_GetComponentsOfRole)(OMX_STRING, OMX_U32*, OMX_U8**);
+ OMX_ERRORTYPE (*ptr_GetRolesOfComponent)(OMX_STRING, OMX_U32*, OMX_U8**);
+ void (*host_init)(void);
+} OMXContext;
+
+static av_cold void *dlsym_prefixed(void *handle, const char *symbol, const char *prefix)
+{
+ char buf[50];
+ snprintf(buf, sizeof(buf), "%s%s", prefix ? prefix : "", symbol);
+ return dlsym(handle, buf);
+}
+
+static av_cold int omx_try_load(OMXContext *s, void *logctx,
+ const char *libname, const char *prefix,
+ const char *libname2)
+{
+ if (libname2) {
+ s->lib2 = dlopen(libname2, RTLD_NOW | RTLD_GLOBAL);
+ if (!s->lib2) {
+ av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname2);
+ return AVERROR_ENCODER_NOT_FOUND;
+ }
+ s->host_init = dlsym(s->lib2, "bcm_host_init");
+ if (!s->host_init) {
+ av_log(logctx, AV_LOG_WARNING, "bcm_host_init not found\n");
+ dlclose(s->lib2);
+ s->lib2 = NULL;
+ return AVERROR_ENCODER_NOT_FOUND;
+ }
+ }
+ s->lib = dlopen(libname, RTLD_NOW | RTLD_GLOBAL);
+ if (!s->lib) {
+ av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname);
+ return AVERROR_ENCODER_NOT_FOUND;
+ }
+ s->ptr_Init = dlsym_prefixed(s->lib, "OMX_Init", prefix);
+ s->ptr_Deinit = dlsym_prefixed(s->lib, "OMX_Deinit", prefix);
+ s->ptr_ComponentNameEnum = dlsym_prefixed(s->lib, "OMX_ComponentNameEnum", prefix);
+ s->ptr_GetHandle = dlsym_prefixed(s->lib, "OMX_GetHandle", prefix);
+ s->ptr_FreeHandle = dlsym_prefixed(s->lib, "OMX_FreeHandle", prefix);
+ s->ptr_GetComponentsOfRole = dlsym_prefixed(s->lib, "OMX_GetComponentsOfRole", prefix);
+ s->ptr_GetRolesOfComponent = dlsym_prefixed(s->lib, "OMX_GetRolesOfComponent", prefix);
+ if (!s->ptr_Init || !s->ptr_Deinit || !s->ptr_ComponentNameEnum ||
+ !s->ptr_GetHandle || !s->ptr_FreeHandle ||
+ !s->ptr_GetComponentsOfRole || !s->ptr_GetRolesOfComponent) {
+ av_log(logctx, AV_LOG_WARNING, "Not all functions found in %s\n", libname);
+ dlclose(s->lib);
+ s->lib = NULL;
+ if (s->lib2)
+ dlclose(s->lib2);
+ s->lib2 = NULL;
+ return AVERROR_ENCODER_NOT_FOUND;
+ }
+ return 0;
+}
+
+static av_cold OMXContext *omx_init(void *logctx, const char *libname, const char *prefix)
+{
+ static const char * const libnames[] = {
+#if CONFIG_OMX_RPI
+ "/opt/vc/lib/libopenmaxil.so", "/opt/vc/lib/libbcm_host.so",
+#else
+ "libOMX_Core.so", NULL,
+ "libOmxCore.so", NULL,
+#endif
+ NULL
+ };
+ const char* const* nameptr;
+ int ret = AVERROR_ENCODER_NOT_FOUND;
+ OMXContext *omx_context;
+
+ omx_context = av_mallocz(sizeof(*omx_context));
+ if (!omx_context)
+ return NULL;
+ if (libname) {
+ ret = omx_try_load(omx_context, logctx, libname, prefix, NULL);
+ if (ret < 0) {
+ av_free(omx_context);
+ return NULL;
+ }
+ } else {
+ for (nameptr = libnames; *nameptr; nameptr += 2)
+ if (!(ret = omx_try_load(omx_context, logctx, nameptr[0], prefix, nameptr[1])))
+ break;
+ if (!*nameptr) {
+ av_free(omx_context);
+ return NULL;
+ }
+ }
+
+ if (omx_context->host_init)
+ omx_context->host_init();
+ omx_context->ptr_Init();
+ return omx_context;
+}
+
+static av_cold void omx_deinit(OMXContext *omx_context)
+{
+ if (!omx_context)
+ return;
+ omx_context->ptr_Deinit();
+ dlclose(omx_context->lib);
+ av_free(omx_context);
+}
+
+typedef struct OMXCodecContext {
+ const AVClass *class;
+ char *libname;
+ char *libprefix;
+ OMXContext *omx_context;
+
+ AVCodecContext *avctx;
+
+ char component_name[OMX_MAX_STRINGNAME_SIZE];
+ OMX_VERSIONTYPE version;
+ OMX_HANDLETYPE handle;
+ int in_port, out_port;
+ OMX_COLOR_FORMATTYPE color_format;
+ int stride, plane_size;
+
+ int num_in_buffers, num_out_buffers;
+ OMX_BUFFERHEADERTYPE **in_buffer_headers;
+ OMX_BUFFERHEADERTYPE **out_buffer_headers;
+ int num_free_in_buffers;
+ OMX_BUFFERHEADERTYPE **free_in_buffers;
+ int num_done_out_buffers;
+ OMX_BUFFERHEADERTYPE **done_out_buffers;
+ pthread_mutex_t input_mutex;
+ pthread_cond_t input_cond;
+ pthread_mutex_t output_mutex;
+ pthread_cond_t output_cond;
+
+ pthread_mutex_t state_mutex;
+ pthread_cond_t state_cond;
+ OMX_STATETYPE state;
+ OMX_ERRORTYPE error;
+
+ int mutex_cond_inited;
+
+ int eos_sent, got_eos;
+
+ uint8_t *output_buf;
+ int output_buf_size;
+
+ int input_zerocopy;
+ int profile;
+} OMXCodecContext;
+
+static void append_buffer(pthread_mutex_t *mutex, pthread_cond_t *cond,
+ int* array_size, OMX_BUFFERHEADERTYPE **array,
+ OMX_BUFFERHEADERTYPE *buffer)
+{
+ pthread_mutex_lock(mutex);
+ array[(*array_size)++] = buffer;
+ pthread_cond_broadcast(cond);
+ pthread_mutex_unlock(mutex);
+}
+
+static OMX_BUFFERHEADERTYPE *get_buffer(pthread_mutex_t *mutex, pthread_cond_t *cond,
+ int* array_size, OMX_BUFFERHEADERTYPE **array,
+ int wait)
+{
+ OMX_BUFFERHEADERTYPE *buffer;
+ pthread_mutex_lock(mutex);
+ if (wait) {
+ while (!*array_size)
+ pthread_cond_wait(cond, mutex);
+ }
+ if (*array_size > 0) {
+ buffer = array[0];
+ (*array_size)--;
+ memmove(&array[0], &array[1], (*array_size) * sizeof(OMX_BUFFERHEADERTYPE*));
+ } else {
+ buffer = NULL;
+ }
+ pthread_mutex_unlock(mutex);
+ return buffer;
+}
+
+static OMX_ERRORTYPE event_handler(OMX_HANDLETYPE component, OMX_PTR app_data, OMX_EVENTTYPE event,
+ OMX_U32 data1, OMX_U32 data2, OMX_PTR event_data)
+{
+ OMXCodecContext *s = app_data;
+ // This uses casts in the printfs, since OMX_U32 actually is a typedef for
+ // unsigned long in official header versions (but there are also modified
+ // versions where it is something else).
+ switch (event) {
+ case OMX_EventError:
+ pthread_mutex_lock(&s->state_mutex);
+ av_log(s->avctx, AV_LOG_ERROR, "OMX error %"PRIx32"\n", (uint32_t) data1);
+ s->error = data1;
+ pthread_cond_broadcast(&s->state_cond);
+ pthread_mutex_unlock(&s->state_mutex);
+ break;
+ case OMX_EventCmdComplete:
+ if (data1 == OMX_CommandStateSet) {
+ pthread_mutex_lock(&s->state_mutex);
+ s->state = data2;
+ av_log(s->avctx, AV_LOG_VERBOSE, "OMX state changed to %"PRIu32"\n", (uint32_t) data2);
+ pthread_cond_broadcast(&s->state_cond);
+ pthread_mutex_unlock(&s->state_mutex);
+ } else if (data1 == OMX_CommandPortDisable) {
+ av_log(s->avctx, AV_LOG_VERBOSE, "OMX port %"PRIu32" disabled\n", (uint32_t) data2);
+ } else if (data1 == OMX_CommandPortEnable) {
+ av_log(s->avctx, AV_LOG_VERBOSE, "OMX port %"PRIu32" enabled\n", (uint32_t) data2);
+ } else {
+ av_log(s->avctx, AV_LOG_VERBOSE, "OMX command complete, command %"PRIu32", value %"PRIu32"\n",
+ (uint32_t) data1, (uint32_t) data2);
+ }
+ break;
+ case OMX_EventPortSettingsChanged:
+ av_log(s->avctx, AV_LOG_VERBOSE, "OMX port %"PRIu32" settings changed\n", (uint32_t) data1);
+ break;
+ default:
+ av_log(s->avctx, AV_LOG_VERBOSE, "OMX event %d %"PRIx32" %"PRIx32"\n",
+ event, (uint32_t) data1, (uint32_t) data2);
+ break;
+ }
+ return OMX_ErrorNone;
+}
+
+static OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE component, OMX_PTR app_data,
+ OMX_BUFFERHEADERTYPE *buffer)
+{
+ OMXCodecContext *s = app_data;
+ if (s->input_zerocopy) {
+ if (buffer->pAppPrivate) {
+ if (buffer->pOutputPortPrivate)
+ av_free(buffer->pAppPrivate);
+ else
+ av_frame_free((AVFrame**)&buffer->pAppPrivate);
+ buffer->pAppPrivate = NULL;
+ }
+ }
+ append_buffer(&s->input_mutex, &s->input_cond,
+ &s->num_free_in_buffers, s->free_in_buffers, buffer);
+ return OMX_ErrorNone;
+}
+
+static OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE component, OMX_PTR app_data,
+ OMX_BUFFERHEADERTYPE *buffer)
+{
+ OMXCodecContext *s = app_data;
+ append_buffer(&s->output_mutex, &s->output_cond,
+ &s->num_done_out_buffers, s->done_out_buffers, buffer);
+ return OMX_ErrorNone;
+}
+
+static const OMX_CALLBACKTYPE callbacks = {
+ event_handler,
+ empty_buffer_done,
+ fill_buffer_done
+};
+
+static av_cold int find_component(OMXContext *omx_context, void *logctx,
+ const char *role, char *str, int str_size)
+{
+ OMX_U32 i, num = 0;
+ char **components;
+ int ret = 0;
+
+#if CONFIG_OMX_RPI
+ if (av_strstart(role, "video_encoder.", NULL)) {
+ av_strlcpy(str, "OMX.broadcom.video_encode", str_size);
+ return 0;
+ }
+#endif
+ omx_context->ptr_GetComponentsOfRole((OMX_STRING) role, &num, NULL);
+ if (!num) {
+ av_log(logctx, AV_LOG_WARNING, "No component for role %s found\n", role);
+ return AVERROR_ENCODER_NOT_FOUND;
+ }
+ components = av_mallocz_array(num, sizeof(*components));
+ if (!components)
+ return AVERROR(ENOMEM);
+ for (i = 0; i < num; i++) {
+ components[i] = av_mallocz(OMX_MAX_STRINGNAME_SIZE);
+ if (!components[i]) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+ }
+ omx_context->ptr_GetComponentsOfRole((OMX_STRING) role, &num, (OMX_U8**) components);
+ av_strlcpy(str, components[0], str_size);
+end:
+ for (i = 0; i < num; i++)
+ av_free(components[i]);
+ av_free(components);
+ return ret;
+}
+
+static av_cold int wait_for_state(OMXCodecContext *s, OMX_STATETYPE state)
+{
+ int ret = 0;
+ pthread_mutex_lock(&s->state_mutex);
+ while (s->state != state && s->error == OMX_ErrorNone)
+ pthread_cond_wait(&s->state_cond, &s->state_mutex);
+ if (s->error != OMX_ErrorNone)
+ ret = AVERROR_ENCODER_NOT_FOUND;
+ pthread_mutex_unlock(&s->state_mutex);
+ return ret;
+}
+
+static av_cold int omx_component_init(AVCodecContext *avctx, const char *role)
+{
+ OMXCodecContext *s = avctx->priv_data;
+ OMX_PARAM_COMPONENTROLETYPE role_params = { 0 };
+ OMX_PORT_PARAM_TYPE video_port_params = { 0 };
+ OMX_PARAM_PORTDEFINITIONTYPE in_port_params = { 0 }, out_port_params = { 0 };
+ OMX_VIDEO_PARAM_PORTFORMATTYPE video_port_format = { 0 };
+ OMX_VIDEO_PARAM_BITRATETYPE vid_param_bitrate = { 0 };
+ OMX_ERRORTYPE err;
+ int i;
+
+ s->version.s.nVersionMajor = 1;
+ s->version.s.nVersionMinor = 1;
+ s->version.s.nRevision = 2;
+
+ err = s->omx_context->ptr_GetHandle(&s->handle, s->component_name, s, (OMX_CALLBACKTYPE*) &callbacks);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "OMX_GetHandle(%s) failed: %x\n", s->component_name, err);
+ return AVERROR_UNKNOWN;
+ }
+
+ // This one crashes the mediaserver on qcom, if used over IOMX
+ INIT_STRUCT(role_params);
+ av_strlcpy(role_params.cRole, role, sizeof(role_params.cRole));
+ // Intentionally ignore errors on this one
+ OMX_SetParameter(s->handle, OMX_IndexParamStandardComponentRole, &role_params);
+
+ INIT_STRUCT(video_port_params);
+ err = OMX_GetParameter(s->handle, OMX_IndexParamVideoInit, &video_port_params);
+ CHECK(err);
+
+ s->in_port = s->out_port = -1;
+ for (i = 0; i < video_port_params.nPorts; i++) {
+ int port = video_port_params.nStartPortNumber + i;
+ OMX_PARAM_PORTDEFINITIONTYPE port_params = { 0 };
+ INIT_STRUCT(port_params);
+ port_params.nPortIndex = port;
+ err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, &port_params);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_WARNING, "port %d error %x\n", port, err);
+ break;
+ }
+ if (port_params.eDir == OMX_DirInput && s->in_port < 0) {
+ in_port_params = port_params;
+ s->in_port = port;
+ } else if (port_params.eDir == OMX_DirOutput && s->out_port < 0) {
+ out_port_params = port_params;
+ s->out_port = port;
+ }
+ }
+ if (s->in_port < 0 || s->out_port < 0) {
+ av_log(avctx, AV_LOG_ERROR, "No in or out port found (in %d out %d)\n", s->in_port, s->out_port);
+ return AVERROR_UNKNOWN;
+ }
+
+ s->color_format = 0;
+ for (i = 0; ; i++) {
+ INIT_STRUCT(video_port_format);
+ video_port_format.nIndex = i;
+ video_port_format.nPortIndex = s->in_port;
+ if (OMX_GetParameter(s->handle, OMX_IndexParamVideoPortFormat, &video_port_format) != OMX_ErrorNone)
+ break;
+ if (video_port_format.eColorFormat == OMX_COLOR_FormatYUV420Planar ||
+ video_port_format.eColorFormat == OMX_COLOR_FormatYUV420PackedPlanar) {
+ s->color_format = video_port_format.eColorFormat;
+ break;
+ }
+ }
+ if (s->color_format == 0) {
+ av_log(avctx, AV_LOG_ERROR, "No supported pixel formats (%d formats available)\n", i);
+ return AVERROR_UNKNOWN;
+ }
+
+ in_port_params.bEnabled = OMX_TRUE;
+ in_port_params.bPopulated = OMX_FALSE;
+ in_port_params.eDomain = OMX_PortDomainVideo;
+
+ in_port_params.format.video.pNativeRender = NULL;
+ in_port_params.format.video.bFlagErrorConcealment = OMX_FALSE;
+ in_port_params.format.video.eColorFormat = s->color_format;
+ s->stride = avctx->width;
+ s->plane_size = avctx->height;
+ // If specific codecs need to manually override the stride/plane_size,
+ // that can be done here.
+ in_port_params.format.video.nStride = s->stride;
+ in_port_params.format.video.nSliceHeight = s->plane_size;
+ in_port_params.format.video.nFrameWidth = avctx->width;
+ in_port_params.format.video.nFrameHeight = avctx->height;
+ if (avctx->framerate.den > 0 && avctx->framerate.num > 0)
+ in_port_params.format.video.xFramerate = (1LL << 16) * avctx->framerate.num / avctx->framerate.den;
+ else
+ in_port_params.format.video.xFramerate = (1LL << 16) * avctx->time_base.den / avctx->time_base.num;
+
+ err = OMX_SetParameter(s->handle, OMX_IndexParamPortDefinition, &in_port_params);
+ CHECK(err);
+ err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, &in_port_params);
+ CHECK(err);
+ s->stride = in_port_params.format.video.nStride;
+ s->plane_size = in_port_params.format.video.nSliceHeight;
+ s->num_in_buffers = in_port_params.nBufferCountActual;
+
+ err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, &out_port_params);
+ out_port_params.bEnabled = OMX_TRUE;
+ out_port_params.bPopulated = OMX_FALSE;
+ out_port_params.eDomain = OMX_PortDomainVideo;
+ out_port_params.format.video.pNativeRender = NULL;
+ out_port_params.format.video.nFrameWidth = avctx->width;
+ out_port_params.format.video.nFrameHeight = avctx->height;
+ out_port_params.format.video.nStride = 0;
+ out_port_params.format.video.nSliceHeight = 0;
+ out_port_params.format.video.nBitrate = avctx->bit_rate;
+ out_port_params.format.video.xFramerate = in_port_params.format.video.xFramerate;
+ out_port_params.format.video.bFlagErrorConcealment = OMX_FALSE;
+ if (avctx->codec->id == AV_CODEC_ID_MPEG4)
+ out_port_params.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+ else if (avctx->codec->id == AV_CODEC_ID_H264)
+ out_port_params.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+
+ err = OMX_SetParameter(s->handle, OMX_IndexParamPortDefinition, &out_port_params);
+ CHECK(err);
+ err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, &out_port_params);
+ CHECK(err);
+ s->num_out_buffers = out_port_params.nBufferCountActual;
+
+ INIT_STRUCT(vid_param_bitrate);
+ vid_param_bitrate.nPortIndex = s->out_port;
+ vid_param_bitrate.eControlRate = OMX_Video_ControlRateVariable;
+ vid_param_bitrate.nTargetBitrate = avctx->bit_rate;
+ err = OMX_SetParameter(s->handle, OMX_IndexParamVideoBitrate, &vid_param_bitrate);
+ if (err != OMX_ErrorNone)
+ av_log(avctx, AV_LOG_WARNING, "Unable to set video bitrate parameter\n");
+
+ if (avctx->codec->id == AV_CODEC_ID_H264) {
+ OMX_VIDEO_PARAM_AVCTYPE avc = { 0 };
+ INIT_STRUCT(avc);
+ avc.nPortIndex = s->out_port;
+ err = OMX_GetParameter(s->handle, OMX_IndexParamVideoAvc, &avc);
+ CHECK(err);
+ avc.nBFrames = 0;
+ avc.nPFrames = avctx->gop_size - 1;
+ switch (s->profile == FF_PROFILE_UNKNOWN ? avctx->profile : s->profile) {
+ case FF_PROFILE_H264_BASELINE:
+ avc.eProfile = OMX_VIDEO_AVCProfileBaseline;
+ break;
+ case FF_PROFILE_H264_MAIN:
+ avc.eProfile = OMX_VIDEO_AVCProfileMain;
+ break;
+ case FF_PROFILE_H264_HIGH:
+ avc.eProfile = OMX_VIDEO_AVCProfileHigh;
+ break;
+ default:
+ break;
+ }
+ err = OMX_SetParameter(s->handle, OMX_IndexParamVideoAvc, &avc);
+ CHECK(err);
+ }
+
+ err = OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateIdle, NULL);
+ CHECK(err);
+
+ s->in_buffer_headers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_in_buffers);
+ s->free_in_buffers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_in_buffers);
+ s->out_buffer_headers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_out_buffers);
+ s->done_out_buffers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_out_buffers);
+ if (!s->in_buffer_headers || !s->free_in_buffers || !s->out_buffer_headers || !s->done_out_buffers)
+ return AVERROR(ENOMEM);
+ for (i = 0; i < s->num_in_buffers && err == OMX_ErrorNone; i++) {
+ if (s->input_zerocopy)
+ err = OMX_UseBuffer(s->handle, &s->in_buffer_headers[i], s->in_port, s, in_port_params.nBufferSize, NULL);
+ else
+ err = OMX_AllocateBuffer(s->handle, &s->in_buffer_headers[i], s->in_port, s, in_port_params.nBufferSize);
+ if (err == OMX_ErrorNone)
+ s->in_buffer_headers[i]->pAppPrivate = s->in_buffer_headers[i]->pOutputPortPrivate = NULL;
+ }
+ CHECK(err);
+ s->num_in_buffers = i;
+ for (i = 0; i < s->num_out_buffers && err == OMX_ErrorNone; i++)
+ err = OMX_AllocateBuffer(s->handle, &s->out_buffer_headers[i], s->out_port, s, out_port_params.nBufferSize);
+ CHECK(err);
+ s->num_out_buffers = i;
+
+ if (wait_for_state(s, OMX_StateIdle) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Didn't get OMX_StateIdle\n");
+ return AVERROR_UNKNOWN;
+ }
+ err = OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
+ CHECK(err);
+ if (wait_for_state(s, OMX_StateExecuting) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Didn't get OMX_StateExecuting\n");
+ return AVERROR_UNKNOWN;
+ }
+
+ for (i = 0; i < s->num_out_buffers && err == OMX_ErrorNone; i++)
+ err = OMX_FillThisBuffer(s->handle, s->out_buffer_headers[i]);
+ if (err != OMX_ErrorNone) {
+ for (; i < s->num_out_buffers; i++)
+ s->done_out_buffers[s->num_done_out_buffers++] = s->out_buffer_headers[i];
+ }
+ for (i = 0; i < s->num_in_buffers; i++)
+ s->free_in_buffers[s->num_free_in_buffers++] = s->in_buffer_headers[i];
+ return err != OMX_ErrorNone ? AVERROR_UNKNOWN : 0;
+}
+
+static av_cold void cleanup(OMXCodecContext *s)
+{
+ int i, executing;
+
+ pthread_mutex_lock(&s->state_mutex);
+ executing = s->state == OMX_StateExecuting;
+ pthread_mutex_unlock(&s->state_mutex);
+
+ if (executing) {
+ OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateIdle, NULL);
+ wait_for_state(s, OMX_StateIdle);
+ OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateLoaded, NULL);
+ for (i = 0; i < s->num_in_buffers; i++) {
+ OMX_BUFFERHEADERTYPE *buffer = get_buffer(&s->input_mutex, &s->input_cond,
+ &s->num_free_in_buffers, s->free_in_buffers, 1);
+ if (s->input_zerocopy)
+ buffer->pBuffer = NULL;
+ OMX_FreeBuffer(s->handle, s->in_port, buffer);
+ }
+ for (i = 0; i < s->num_out_buffers; i++) {
+ OMX_BUFFERHEADERTYPE *buffer = get_buffer(&s->output_mutex, &s->output_cond,
+ &s->num_done_out_buffers, s->done_out_buffers, 1);
+ OMX_FreeBuffer(s->handle, s->out_port, buffer);
+ }
+ wait_for_state(s, OMX_StateLoaded);
+ }
+ if (s->handle) {
+ s->omx_context->ptr_FreeHandle(s->handle);
+ s->handle = NULL;
+ }
+
+ omx_deinit(s->omx_context);
+ s->omx_context = NULL;
+ if (s->mutex_cond_inited) {
+ pthread_cond_destroy(&s->state_cond);
+ pthread_mutex_destroy(&s->state_mutex);
+ pthread_cond_destroy(&s->input_cond);
+ pthread_mutex_destroy(&s->input_mutex);
+ pthread_cond_destroy(&s->output_cond);
+ pthread_mutex_destroy(&s->output_mutex);
+ s->mutex_cond_inited = 0;
+ }
+ av_freep(&s->in_buffer_headers);
+ av_freep(&s->out_buffer_headers);
+ av_freep(&s->free_in_buffers);
+ av_freep(&s->done_out_buffers);
+ av_freep(&s->output_buf);
+}
+
+static av_cold int omx_encode_init(AVCodecContext *avctx)
+{
+ OMXCodecContext *s = avctx->priv_data;
+ int ret = AVERROR_ENCODER_NOT_FOUND;
+ const char *role;
+ OMX_BUFFERHEADERTYPE *buffer;
+ OMX_ERRORTYPE err;
+
+ s->omx_context = omx_init(avctx, s->libname, s->libprefix);
+ if (!s->omx_context)
+ return AVERROR_ENCODER_NOT_FOUND;
+
+ pthread_mutex_init(&s->state_mutex, NULL);
+ pthread_cond_init(&s->state_cond, NULL);
+ pthread_mutex_init(&s->input_mutex, NULL);
+ pthread_cond_init(&s->input_cond, NULL);
+ pthread_mutex_init(&s->output_mutex, NULL);
+ pthread_cond_init(&s->output_cond, NULL);
+ s->mutex_cond_inited = 1;
+ s->avctx = avctx;
+ s->state = OMX_StateLoaded;
+ s->error = OMX_ErrorNone;
+
+ switch (avctx->codec->id) {
+ case AV_CODEC_ID_MPEG4:
+ role = "video_encoder.mpeg4";
+ break;
+ case AV_CODEC_ID_H264:
+ role = "video_encoder.avc";
+ break;
+ default:
+ return AVERROR(ENOSYS);
+ }
+
+ if ((ret = find_component(s->omx_context, avctx, role, s->component_name, sizeof(s->component_name))) < 0)
+ goto fail;
+
+ av_log(avctx, AV_LOG_INFO, "Using %s\n", s->component_name);
+
+ if ((ret = omx_component_init(avctx, role)) < 0)
+ goto fail;
+
+ if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
+ while (1) {
+ buffer = get_buffer(&s->output_mutex, &s->output_cond,
+ &s->num_done_out_buffers, s->done_out_buffers, 1);
+ if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+ if ((ret = av_reallocp(&avctx->extradata, avctx->extradata_size + buffer->nFilledLen + AV_INPUT_BUFFER_PADDING_SIZE)) < 0) {
+ avctx->extradata_size = 0;
+ goto fail;
+ }
+ memcpy(avctx->extradata + avctx->extradata_size, buffer->pBuffer + buffer->nOffset, buffer->nFilledLen);
+ avctx->extradata_size += buffer->nFilledLen;
+ memset(avctx->extradata + avctx->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+ }
+ err = OMX_FillThisBuffer(s->handle, buffer);
+ if (err != OMX_ErrorNone) {
+ append_buffer(&s->output_mutex, &s->output_cond,
+ &s->num_done_out_buffers, s->done_out_buffers, buffer);
+ av_log(avctx, AV_LOG_ERROR, "OMX_FillThisBuffer failed: %x\n", err);
+ ret = AVERROR_UNKNOWN;
+ goto fail;
+ }
+ if (avctx->codec->id == AV_CODEC_ID_H264) {
+ // For H.264, the extradata can be returned in two separate buffers
+ // (the videocore encoder on raspberry pi does this);
+ // therefore check that we have got both SPS and PPS before continuing.
+ int nals[32] = { 0 };
+ int i;
+ for (i = 0; i + 4 < avctx->extradata_size; i++) {
+ if (!avctx->extradata[i + 0] &&
+ !avctx->extradata[i + 1] &&
+ !avctx->extradata[i + 2] &&
+ avctx->extradata[i + 3] == 1) {
+ nals[avctx->extradata[i + 4] & 0x1f]++;
+ }
+ }
+ if (nals[H264_NAL_SPS] && nals[H264_NAL_PPS])
+ break;
+ } else {
+ if (avctx->extradata_size > 0)
+ break;
+ }
+ }
+ }
+
+ return 0;
+fail:
+ return ret;
+}
+
+
+static int omx_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
+ const AVFrame *frame, int *got_packet)
+{
+ OMXCodecContext *s = avctx->priv_data;
+ int ret = 0;
+ OMX_BUFFERHEADERTYPE* buffer;
+ OMX_ERRORTYPE err;
+ int had_partial = 0;
+
+ if (frame) {
+ uint8_t *dst[4];
+ int linesize[4];
+ int need_copy;
+ buffer = get_buffer(&s->input_mutex, &s->input_cond,
+ &s->num_free_in_buffers, s->free_in_buffers, 1);
+
+ buffer->nFilledLen = av_image_fill_arrays(dst, linesize, buffer->pBuffer, avctx->pix_fmt, s->stride, s->plane_size, 1);
+
+ if (s->input_zerocopy) {
+ uint8_t *src[4] = { NULL };
+ int src_linesize[4];
+ av_image_fill_arrays(src, src_linesize, frame->data[0], avctx->pix_fmt, s->stride, s->plane_size, 1);
+ if (frame->linesize[0] == src_linesize[0] &&
+ frame->linesize[1] == src_linesize[1] &&
+ frame->linesize[2] == src_linesize[2] &&
+ frame->data[1] == src[1] &&
+ frame->data[2] == src[2]) {
+ // If the input frame happens to have all planes stored contiguously,
+ // with the right strides, just clone the frame and set the OMX
+ // buffer header to point to it
+ AVFrame *local = av_frame_clone(frame);
+ if (!local) {
+ // Return the buffer to the queue so it's not lost
+ append_buffer(&s->input_mutex, &s->input_cond, &s->num_free_in_buffers, s->free_in_buffers, buffer);
+ return AVERROR(ENOMEM);
+ } else {
+ buffer->pAppPrivate = local;
+ buffer->pOutputPortPrivate = NULL;
+ buffer->pBuffer = local->data[0];
+ need_copy = 0;
+ }
+ } else {
+ // If not, we need to allocate a new buffer with the right
+ // size and copy the input frame into it.
+ uint8_t *buf = NULL;
+ int image_buffer_size = av_image_get_buffer_size(avctx->pix_fmt, s->stride, s->plane_size, 1);
+ if (image_buffer_size >= 0)
+ buf = av_malloc(image_buffer_size);
+ if (!buf) {
+ // Return the buffer to the queue so it's not lost
+ append_buffer(&s->input_mutex, &s->input_cond, &s->num_free_in_buffers, s->free_in_buffers, buffer);
+ return AVERROR(ENOMEM);
+ } else {
+ buffer->pAppPrivate = buf;
+ // Mark that pAppPrivate is an av_malloc'ed buffer, not an AVFrame
+ buffer->pOutputPortPrivate = (void*) 1;
+ buffer->pBuffer = buf;
+ need_copy = 1;
+ buffer->nFilledLen = av_image_fill_arrays(dst, linesize, buffer->pBuffer, avctx->pix_fmt, s->stride, s->plane_size, 1);
+ }
+ }
+ } else {
+ need_copy = 1;
+ }
+ if (need_copy)
+ av_image_copy(dst, linesize, (const uint8_t**) frame->data, frame->linesize, avctx->pix_fmt, avctx->width, avctx->height);
+ buffer->nFlags = OMX_BUFFERFLAG_ENDOFFRAME;
+ buffer->nOffset = 0;
+ // Convert the timestamps to microseconds; some encoders can ignore
+ // the framerate and do VFR bit allocation based on timestamps.
+ buffer->nTimeStamp = to_omx_ticks(av_rescale_q(frame->pts, avctx->time_base, AV_TIME_BASE_Q));
+ if (frame->pict_type == AV_PICTURE_TYPE_I) {
+#if CONFIG_OMX_RPI
+ OMX_CONFIG_BOOLEANTYPE config = {0, };
+ INIT_STRUCT(config);
+ config.bEnabled = OMX_TRUE;
+ err = OMX_SetConfig(s->handle, OMX_IndexConfigBrcmVideoRequestIFrame, &config);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "OMX_SetConfig(RequestIFrame) failed: %x\n", err);
+ }
+#else
+ OMX_CONFIG_INTRAREFRESHVOPTYPE config = {0, };
+ INIT_STRUCT(config);
+ config.nPortIndex = s->out_port;
+ config.IntraRefreshVOP = OMX_TRUE;
+ err = OMX_SetConfig(s->handle, OMX_IndexConfigVideoIntraVOPRefresh, &config);
+ if (err != OMX_ErrorNone) {
+ av_log(avctx, AV_LOG_ERROR, "OMX_SetConfig(IntraVOPRefresh) failed: %x\n", err);
+ }
+#endif
+ }
+ err = OMX_EmptyThisBuffer(s->handle, buffer);
+ if (err != OMX_ErrorNone) {
+ append_buffer(&s->input_mutex, &s->input_cond, &s->num_free_in_buffers, s->free_in_buffers, buffer);
+ av_log(avctx, AV_LOG_ERROR, "OMX_EmptyThisBuffer failed: %x\n", err);
+ return AVERROR_UNKNOWN;
+ }
+ } else if (!s->eos_sent) {
+ buffer = get_buffer(&s->input_mutex, &s->input_cond,
+ &s->num_free_in_buffers, s->free_in_buffers, 1);
+
+ buffer->nFilledLen = 0;
+ buffer->nFlags = OMX_BUFFERFLAG_EOS;
+ buffer->pAppPrivate = buffer->pOutputPortPrivate = NULL;
+ err = OMX_EmptyThisBuffer(s->handle, buffer);
+ if (err != OMX_ErrorNone) {
+ append_buffer(&s->input_mutex, &s->input_cond, &s->num_free_in_buffers, s->free_in_buffers, buffer);
+ av_log(avctx, AV_LOG_ERROR, "OMX_EmptyThisBuffer failed: %x\n", err);
+ return AVERROR_UNKNOWN;
+ }
+ s->eos_sent = 1;
+ }
+
+ while (!*got_packet && ret == 0 && !s->got_eos) {
+ // If not flushing, just poll the queue if there's finished packets.
+ // If flushing, do a blocking wait until we either get a completed
+ // packet, or get EOS.
+ buffer = get_buffer(&s->output_mutex, &s->output_cond,
+ &s->num_done_out_buffers, s->done_out_buffers,
+ !frame || had_partial);
+ if (!buffer)
+ break;
+
+ if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
+ s->got_eos = 1;
+
+ if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG && avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
+ if ((ret = av_reallocp(&avctx->extradata, avctx->extradata_size + buffer->nFilledLen + AV_INPUT_BUFFER_PADDING_SIZE)) < 0) {
+ avctx->extradata_size = 0;
+ goto end;
+ }
+ memcpy(avctx->extradata + avctx->extradata_size, buffer->pBuffer + buffer->nOffset, buffer->nFilledLen);
+ avctx->extradata_size += buffer->nFilledLen;
+ memset(avctx->extradata + avctx->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+ } else {
+ if (!(buffer->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) || !pkt->data) {
+ // If the output packet isn't preallocated, just concatenate everything in our
+ // own buffer
+ int newsize = s->output_buf_size + buffer->nFilledLen + AV_INPUT_BUFFER_PADDING_SIZE;
+ if ((ret = av_reallocp(&s->output_buf, newsize)) < 0) {
+ s->output_buf_size = 0;
+ goto end;
+ }
+ memcpy(s->output_buf + s->output_buf_size, buffer->pBuffer + buffer->nOffset, buffer->nFilledLen);
+ s->output_buf_size += buffer->nFilledLen;
+ if (buffer->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) {
+ if ((ret = av_packet_from_data(pkt, s->output_buf, s->output_buf_size)) < 0) {
+ av_freep(&s->output_buf);
+ s->output_buf_size = 0;
+ goto end;
+ }
+ s->output_buf = NULL;
+ s->output_buf_size = 0;
+ }
+#if CONFIG_OMX_RPI
+ had_partial = 1;
+#endif
+ } else {
+ // End of frame, and the caller provided a preallocated frame
+ if ((ret = ff_alloc_packet2(avctx, pkt, s->output_buf_size + buffer->nFilledLen, 0)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Error getting output packet of size %d.\n",
+ (int)(s->output_buf_size + buffer->nFilledLen));
+ goto end;
+ }
+ memcpy(pkt->data, s->output_buf, s->output_buf_size);
+ memcpy(pkt->data + s->output_buf_size, buffer->pBuffer + buffer->nOffset, buffer->nFilledLen);
+ av_freep(&s->output_buf);
+ s->output_buf_size = 0;
+ }
+ if (buffer->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) {
+ pkt->pts = av_rescale_q(from_omx_ticks(buffer->nTimeStamp), AV_TIME_BASE_Q, avctx->time_base);
+ // We don't currently enable B-frames for the encoders, so set
+ // pkt->dts = pkt->pts. (The calling code behaves worse if the encoder
+ // doesn't set the dts).
+ pkt->dts = pkt->pts;
+ if (buffer->nFlags & OMX_BUFFERFLAG_SYNCFRAME)
+ pkt->flags |= AV_PKT_FLAG_KEY;
+ *got_packet = 1;
+ }
+ }
+end:
+ err = OMX_FillThisBuffer(s->handle, buffer);
+ if (err != OMX_ErrorNone) {
+ append_buffer(&s->output_mutex, &s->output_cond, &s->num_done_out_buffers, s->done_out_buffers, buffer);
+ av_log(avctx, AV_LOG_ERROR, "OMX_FillThisBuffer failed: %x\n", err);
+ ret = AVERROR_UNKNOWN;
+ }
+ }
+ return ret;
+}
+
+static av_cold int omx_encode_end(AVCodecContext *avctx)
+{
+ OMXCodecContext *s = avctx->priv_data;
+
+ cleanup(s);
+ return 0;
+}
+
+#define OFFSET(x) offsetof(OMXCodecContext, x)
+#define VDE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+static const AVOption options[] = {
+ { "omx_libname", "OpenMAX library name", OFFSET(libname), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VDE },
+ { "omx_libprefix", "OpenMAX library prefix", OFFSET(libprefix), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VDE },
+ { "zerocopy", "Try to avoid copying input frames if possible", OFFSET(input_zerocopy), AV_OPT_TYPE_INT, { .i64 = CONFIG_OMX_RPI }, 0, 1, VE },
+ { "profile", "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = FF_PROFILE_UNKNOWN }, FF_PROFILE_UNKNOWN, FF_PROFILE_H264_HIGH, VE, "profile" },
+ { "baseline", "", 0, AV_OPT_TYPE_CONST, { .i64 = FF_PROFILE_H264_BASELINE }, 0, 0, VE, "profile" },
+ { "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = FF_PROFILE_H264_MAIN }, 0, 0, VE, "profile" },
+ { "high", "", 0, AV_OPT_TYPE_CONST, { .i64 = FF_PROFILE_H264_HIGH }, 0, 0, VE, "profile" },
+ { NULL }
+};
+
+static const enum AVPixelFormat omx_encoder_pix_fmts[] = {
+ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE
+};
+
+static const AVClass omx_mpeg4enc_class = {
+ .class_name = "mpeg4_omx",
+ .item_name = av_default_item_name,
+ .option = options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+AVCodec ff_mpeg4_omx_encoder = {
+ .name = "mpeg4_omx",
+ .long_name = NULL_IF_CONFIG_SMALL("OpenMAX IL MPEG-4 video encoder"),
+ .type = AVMEDIA_TYPE_VIDEO,
+ .id = AV_CODEC_ID_MPEG4,
+ .priv_data_size = sizeof(OMXCodecContext),
+ .init = omx_encode_init,
+ .encode2 = omx_encode_frame,
+ .close = omx_encode_end,
+ .pix_fmts = omx_encoder_pix_fmts,
+ .capabilities = AV_CODEC_CAP_DELAY,
+ .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
+ .priv_class = &omx_mpeg4enc_class,
+};
+
+static const AVClass omx_h264enc_class = {
+ .class_name = "h264_omx",
+ .item_name = av_default_item_name,
+ .option = options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+AVCodec ff_h264_omx_encoder = {
+ .name = "h264_omx",
+ .long_name = NULL_IF_CONFIG_SMALL("OpenMAX IL H.264 video encoder"),
+ .type = AVMEDIA_TYPE_VIDEO,
+ .id = AV_CODEC_ID_H264,
+ .priv_data_size = sizeof(OMXCodecContext),
+ .init = omx_encode_init,
+ .encode2 = omx_encode_frame,
+ .close = omx_encode_end,
+ .pix_fmts = omx_encoder_pix_fmts,
+ .capabilities = AV_CODEC_CAP_DELAY,
+ .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
+ .priv_class = &omx_h264enc_class,
+};